【发布时间】:2014-11-17 05:59:48
【问题描述】:
有人能解释为什么 Valgrind 将此程序归类为“肯定丢失:1 个块中的 2 个字节”内存泄漏吗?我知道注释行解决了这个问题,但我不明白分类。根据 Valgrind 文档,似乎内存泄漏应归类为“间接可访问”。我也很好奇为什么这甚至被认为是内存泄漏,并希望得到解释。即使程序在 main 函数结束时终止,手动释放所有内容是一种好习惯吗?
#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()可以暴露您的程序中很难找到的错误。总是在完成分配代码后直接执行解除分配是一个好习惯。 -
我没有看到这个。我看到 8 个字节肯定丢失(
root)和 2 个字节间接丢失(root->data)。你能发布 valgrind 的完整输出吗? -
你应该
#include <string.h>,因为编译器可以用strdup做“神奇”的事情(GCC有时也可以) -
@sharth 我已经包含了 Valgrind 的输出。
-
@PanThomakos:你用
-O3编译了吗?
标签: c memory-leaks valgrind