我正在运行valgrind来寻找内存泄漏。我在main函数中分配了两个全局变量;然后,在main
结束时,我释放了两个,但Valgrind一直在写:
==18311== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311== by 0x804A30C: main (application.c:730)
==18311==
==18311== 16 bytes in 1 blocks are definitely lost in loss record 2 of 2
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311== by 0x804A31D: main (application.c:731)
泄漏摘要:
==18311== LEAK SUMMARY:
==18311== definitely lost: 32 bytes in 2 blocks
==18311== indirectly lost: 0 bytes in 0 blocks
==18311== possibly lost: 0 bytes in 0 blocks
==18311== still reachable: 0 bytes in 0 blocks
==18311== suppressed: 0 bytes in 0 blocks
为什么我不能释放这两个变量?
修改
someList *something; *something_else;
使用的结构有两个类型为char *
的字段和一个字段someList *next
。
后来有很多代码。一些线程将使用这两个变量添加/编辑/删除对象。
something -> object 1 -> ... -> object n
something_else -> object 1 -> ... -> object m
其中->
表示something->next = object 1
和object k
都是someList *
的实例。
在应用程序结束时,我释放了每个object k
元素的每个字段。然后,在最后一部分:
free(something);
free(something_else);
我可能忘记释放一个物体的场。这会导致我在这里的行为吗?
我希望现在更清楚了。
答案 0 :(得分:1)
您确定要取消分配所有变量吗? Valgrind说你不是。
尝试使代码变得纤细并在此处发布,或者进行更多调试。
答案 1 :(得分:0)
对于每个malloc()
调用,您通常需要进行相应的free()
调用,以避免内存泄漏。为了获得最佳的内存使用率,在完成内存后,应尽快free()
分配每个内存块。
在您的情况下,您在malloc()
和application.c:730
中有两次application.c:731
来电,在您的节目终止时,系统没有free()
来电。因此,分配的存储块不会被释放。这会导致Valgrind
检测到并报告的内存泄漏。
除非您向我们提供有关您的计划的一些代码和/或更多信息,否则我们无法为您提供更多帮助。
编辑:
Valgrind
输出中有两行有趣的内容:
==18311== definitely lost: 32 bytes in 2 blocks
...
==18311== still reachable: 0 bytes in 0 blocks
您肯定“丢失”了两个内存块,并且在程序终止时没有指向它们的指针。这意味着指向这两个块的指针实际上已经被覆盖,或者在程序过程中失去了它们的价值。
此问题的常见原因是将两个malloc()
调用的结果存储到同一指针而不进行中间free()
调用。另一个可能的原因是由于指针算术运算导致指针值发生变化 - Valgrind
会尝试检测其中一些情况,但它并不总是成功,具体取决于您的代码。