Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测C语言中的内存泄漏_C_Debugging_Memory Leaks - Fatal编程技术网

检测C语言中的内存泄漏

检测C语言中的内存泄漏,c,debugging,memory-leaks,C,Debugging,Memory Leaks,我知道这不是一个新问题,但我在其他地方没有发现任何有效的方法。 我有一个C程序,它在运行时稳定地消耗内存——我使用“free”命令跟踪它,我可以看到只要它执行,可用内存量就会减少,这是不应该发生的。然而,我在程序中找不到任何可能导致这种情况的东西。我还用valgrind和dmalloc测试了它,它们中的任何一个都能检测到任何内存丢失 如何查找泄漏?如果您确定内存的使用情况,那么问题可能不是您的malloc和free 如果您正在使用任何LIB,您应该仔细检查是否正确使用它们。很多都有初始化和释放功

我知道这不是一个新问题,但我在其他地方没有发现任何有效的方法。 我有一个C程序,它在运行时稳定地消耗内存——我使用“free”命令跟踪它,我可以看到只要它执行,可用内存量就会减少,这是不应该发生的。然而,我在程序中找不到任何可能导致这种情况的东西。我还用valgrind和dmalloc测试了它,它们中的任何一个都能检测到任何内存丢失

如何查找泄漏?

如果您确定内存的使用情况,那么问题可能不是您的malloc和free

如果您正在使用任何LIB,您应该仔细检查是否正确使用它们。很多都有初始化和释放功能,您很容易忘记这些功能,从而导致内存泄漏。

如果您确定内存的使用情况,那么问题可能不是您的malloc和free


如果您正在使用任何LIB,您应该仔细检查是否正确使用它们。许多程序都有初始化和释放功能,您很容易忘记这些功能,从而导致内存泄漏。

是内存实际泄漏,还是程序运行时间越长,消耗的内存就越多?换句话说,该程序是否可能构建一个持续增长的大型动态数据结构(链表等)?只要程序有一个指向内存的指针,它就不是真正的泄漏——但是如果分配从未释放,那么每个新的分配都会从操作系统获得更多内存。这也解释了为什么您使用的工具没有报告“泄漏”

当我不得不这样做的时候,我会做一些事情,比如每次我的程序分配内存并释放内存时,都会将日志消息写入一个平面文件。这些消息包括分配内存的文件名和程序行以及分配内存时从malloc返回的地址,或者类似地,释放内存的文件名和程序行以及释放缓冲区的地址。然后,您可以按地址对生成的文件进行排序,那些带有“分配”消息但没有“自由”消息的地址可能已泄漏,或者至少在程序终止时尚未释放。这可能需要很长时间来实现,如果你有自动化工具,它会更好——但是根据你的情况,你可能不得不这样做

或者,您可能只想平底船并使用垃圾收集器。Boehm收藏家可能会为你工作-看看


共享和享受。

内存是真的泄漏了,还是程序运行时间越长,消耗的内存就越多?换句话说,该程序是否可能构建一个持续增长的大型动态数据结构(链表等)?只要程序有一个指向内存的指针,它就不是真正的泄漏——但是如果分配从未释放,那么每个新的分配都会从操作系统获得更多内存。这也解释了为什么您使用的工具没有报告“泄漏”

当我不得不这样做的时候,我会做一些事情,比如每次我的程序分配内存并释放内存时,都会将日志消息写入一个平面文件。这些消息包括分配内存的文件名和程序行以及分配内存时从malloc返回的地址,或者类似地,释放内存的文件名和程序行以及释放缓冲区的地址。然后,您可以按地址对生成的文件进行排序,那些带有“分配”消息但没有“自由”消息的地址可能已泄漏,或者至少在程序终止时尚未释放。这可能需要很长时间来实现,如果你有自动化工具,它会更好——但是根据你的情况,你可能不得不这样做

或者,您可能只想平底船并使用垃圾收集器。Boehm收藏家可能会为你工作-看看


共享和享受。

您确定在使用的内存量中没有包含缓冲区吗?如果您的程序读取文件等,这可能会导致那里的内存稳步增加,但内存并没有真正“在使用”,因为其他应用程序将无法使用它。我非常肯定。我第一次注意到这一点是在我让程序运行两天后,它填满了所有的内存并崩溃了。你确定在使用的内存量中没有包括缓冲区吗?如果您的程序读取文件等,这可能会导致那里的内存稳步增加,但内存并没有真正“在使用”,因为其他应用程序将无法使用它。我非常肯定。我第一次注意到这一点是在我让程序运行两天后,它填满了所有内存并崩溃。OP还可以尝试使用
massif
Valgrind工具(而不是默认的
memcheck
),这是一个堆分析器。它计算了分配内存的程序部分的总分配内存,这应该允许您精确定位内存的使用位置。@caf-我相信OP注意到他已经尝试了valgrind和dmalloc。OP提到使用valgrind查找内存泄漏,这意味着他们使用了
memcheck
工具。Valgrind实际上是一个由多种不同工具组成的软件包,我建议使用
massif
堆探查器(它不查找泄漏,但分析内存使用情况),因为它根本不是经典意义上的“泄漏”。我认为您第一段中的区别是不正确的。单个
(void)malloc(1000)(执行一次或甚至有限制的次数)不是内存泄漏,而在程序的生命周期中逐渐增加的内存使用量则是内存泄漏,除非它与用户的特定需求有关,并且可以通过用户执行的某些操作来逆转。我只使用了memcheck,但在提出这个建议后,我又回去尝试了massif-n