如何在C中跟踪malloc中的内存分配错误

时间:2014-07-09 16:23:57

标签: c memory-management segmentation-fault malloc valgrind

我正在尝试使用malloc函数为链接列表中的节点分配内存。但是,我在malloc调用上遇到分段错误。我无法理解valgrind生成的报告。

==28861==   total heap usage: 76 allocs, 73 frees, 14,544 bytes allocated
==28861== 
==28861== 48 bytes in 1 blocks are still reachable in loss record 1 of 3
==28861==    at 0x4A0610C: malloc (vg_replace_malloc.c:195)
==28861==    by 0x4027A2: create_server_entry_into_connection_list (all.c:734)
==28861==    by 0x401BF8: server_call (all.c:410)
==28861==    by 0x40103F: main (all.c:108)
==28861== 
==28861== 568 bytes in 1 blocks are still reachable in loss record 2 of 3
==28861==    at 0x4A0610C: malloc (vg_replace_malloc.c:195)
==28861==    by 0x3E3C260309: __fopen_internal (in /lib64/libc-2.5.so)
==28861==    by 0x4012E2: myip (all.c:174)
==28861==    by 0x400FE7: main (all.c:101)
==28861== 
==28861== 1,024 bytes in 1 blocks are still reachable in loss record 3 of 3
==28861==    at 0x4A0610C: malloc (vg_replace_malloc.c:195)
==28861==    by 0x4027B3: create_server_entry_into_connection_list (all.c:736)
==28861==    by 0x401BF8: server_call (all.c:410)
==28861==    by 0x40103F: main (all.c:108)
==28861== 
==28861== LEAK SUMMARY:
==28861==    definitely lost: 0 bytes in 0 blocks
==28861==    indirectly lost: 0 bytes in 0 blocks
==28861==      possibly lost: 0 bytes in 0 blocks
==28861==    still reachable: 1,640 bytes in 3 blocks
==28861==         suppressed: 0 bytes in 0 blocks
==28861== 
==28861== For counts of detected and suppressed errors, rerun with: -v
==28861== Use --track-origins=yes to see where uninitialised values come from
==28861== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)
Segmentation fault

任何人都可以解释这种错误背后的原因。

2 个答案:

答案 0 :(得分:0)

原因?有很多可能的原因。

尝试使用errno.h它可能能够确定一些问题。 strerror(errno)然后将错误作为字符串而不是数字返回。 从调试控制台的第一个错误开始..仔细看看。

  

总堆使用量:76个分配,73个释放,14,544个字节分配

...我认为你应该重组你的代码。这次更经常关注和测试程序。 76个分配,73个自由。只分配了14,544个字节?

使用printf("p1 : %p\np2 : %p", pointer1, pointer2);等测试来调查内存地址。 valgrind有时表现得很奇怪。这是可靠的。 如果你的代码太大了......也许可以使用hastebin.com为我们提供代码的通用视图。

不要指责指针。

答案 1 :(得分:0)

通常still reachable内存指向分配给全局指针的内存,并且在程序完成时不会被释放。这并不总是指向内存泄漏。您可以阅读有关here的更多信息。