Valgrind和全局变量

时间:2011-01-22 13:30:17

标签: c memory-leaks valgrind

我正在运行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 1object k都是someList *的实例。

在应用程序结束时,我释放了每个object k元素的每个字段。然后,在最后一部分:

free(something);
free(something_else);

我可能忘记释放一个物体的场。这会导致我在这里的行为吗?

我希望现在更清楚了。

2 个答案:

答案 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会尝试检测其中一些情况,但它并不总是成功,具体取决于您的代码。