有人能够阐明为什么Valgrind将此程序归类为“绝对丢失:2个字节的1块”内存泄漏?我了解评论线可以解决问题,但我不了解分类。根据Valgrind文档,内存泄漏应该被分类为“间接可达”。我也很好奇,为什么这甚至被认为是内存泄漏,并会赞赏解释。即使程序在main
函数的末尾终止,是否手动释放所有内容是一种好的做法?在C程序中肯定会失去内存泄漏
#include <stdlib.h>
struct wrapper {
char *data;
};
char *strdup(const char *);
struct wrapper *walloc(struct wrapper *root)
{
if (root == NULL){
root = (struct wrapper *) malloc(sizeof(struct wrapper));
root->data = strdup("H");
}
return root;
}
int main(){
struct wrapper *root;
root = NULL;
root = walloc(root);
//free(root->data);
return 0;
}
这里是Valgrind的输出:
$ valgrind --leak-check=full ./leak
==26489== Memcheck, a memory error detector
==26489== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==26489== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==26489== Command: ./leak
==26489==
==26489==
==26489== HEAP SUMMARY:
==26489== in use at exit: 2 bytes in 1 blocks
==26489== total heap usage: 2 allocs, 1 frees, 1,790 bytes allocated
==26489==
==26489== 2 bytes in 1 blocks are definitely lost in loss record 1 of 1
==26489== at 0x4C29F90: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26489== by 0x4EB79C9: strdup (in /usr/lib/libc-2.20.so)
==26489== by 0x400542: walloc (leak.c:13)
==26489== by 0x400542: main (leak.c:23)
==26489==
==26489== LEAK SUMMARY:
==26489== definitely lost: 2 bytes in 1 blocks
==26489== indirectly lost: 0 bytes in 0 blocks
==26489== possibly lost: 0 bytes in 0 blocks
==26489== still reachable: 0 bytes in 0 blocks
==26489== suppressed: 0 bytes in 0 blocks
==26489==
==26489== For counts of detected and suppressed errors, rerun with: -v
==26489== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
“它是很好的做法,即使该程序在主函数结束时终止手动自由的一切吗?”是的,即使操作系统释放内存,也要这样做。 'free()'可以暴露程序中的错误,否则很难找到它们。在完成分配代码后直接执行解除分配是一种好习惯。 – Lundin 2014-09-23 06:35:24
我没看到这个。我看到8个字节肯定丢失('root'),2个字节间接丢失('root-> data')。你能发布valgrind的完整输出吗? – 2014-09-23 06:38:07
你应该'#include',因为编译器可以用'strdup'(和[GCC](http://gcc.gnu.org/)有时候做)“神奇”的东西 –
2014-09-23 06:42:15