如何检查c代码中的内存泄漏?

时间:2011-08-05 11:01:52

标签: c memory embedded

看到我使用多次malloc&免费。

所以在应用程序结束时我想确保没有内存泄漏。 所有malloc都被释放了。

有什么方法或功能可以看到吗?

另一个问题: 只有当应用程序退出但是如果应用程序被认为是长时间运行时,所有os都主要回收内存。如果这样它不断地泄漏记忆然后在某个时候将没有未经过清除的记忆和应用程序将崩溃或系统将重新启动... !!是真的吗??? ???

4 个答案:

答案 0 :(得分:3)

在一个过程结束时,OS回收使用过的内存(因此它不能“泄漏”)。

  

所以在应用程序结束时我想确保没有内存   泄漏

修改

James在评论中提出了一个有趣的观点:“任何体面的程序员都不应该依赖操作系统来完成他的工作”。我必须强调我正在考虑以下情况:

/* mallocs */

/* frees <- useless */
exit(0);

答案 1 :(得分:2)

无法保证操作系统会回收您的记忆。桌面或服务器操作系统通常会;嵌入式操作系统可能没有。

那里有几个调试malloc库; google for debug malloc并使用适合您的方式。 GNU libc内置了调试malloc

答案 2 :(得分:1)

首先,您应该使用调试支持编译代码(在gcc中,它是-g)。请注意,这不是必需的,但这使调试器能够为您提供行号作为优势之一。

然后你应该用一个很好的调试器来运行你的代码,比如valgrind或gdb或者其他什么。 他们应该告诉你内存分配但未释放的行。

Valgrind是一个非常强大的调试工具。您需要使用--tool = memcheck选项(我认为默认情况下已启用但不知道如何)。

答案 3 :(得分:0)

您可以打包malloc()free(),并自行计算一些基本统计数据

#define malloc(x) malloc_stat(x)
#define free(x) free_stat(x)

static counter = 0;

void* malloc_stat( size_t s ) {
    counter++;
    return malloc(s);
}

void free_stat( p ) {
    counter--;
    free(p);
}