检测C程序中的内存泄漏?

如果我们想检查C ++程序中的内存泄漏,我们可以重载newdelete操作符以跟踪分配的内存。 如果我们想检查C程序中的泄漏怎么办? 由于C中没有运算符重载,我们是否可以覆盖malloc函数指针来拦截对malloc调用并跟踪内存分配? 没有使用任何外部工具有没有更简单的方法? 请提供一些代码,因为我不熟悉覆盖方法指针。

注意:我想在没有任何外部实用程序的情况下执行此操作。

正如所建议的,已经存在像Valgrind这样的优秀工具。

进一步:

我想这样做,没有任何外部实用工具
这很有趣,我相信这将是充实的,
您可以使用宏技巧来检测此类内存使用情况和泄漏错误,实际上您可以编写自己的整洁泄漏检测器。 只要在项目中有一个分配和释放function,您就应该能够这样做。

 #define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__) void* my_malloc(size_t size, const char *file, int line, const char *func) { void *p = malloc(size); printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size); /*Link List functionality goes in here*/ return p; } 

您维护一个链接的地址列表,其中包含分配的文件和行号。 您使用malloc条目更新链接列表。

与上面类似,您可以free编写实现,其中您检查要求释放链接列表的地址条目。 如果没有匹配的条目,则表示使用错误,您可以将其标记出来。

在程序结束时,您可以将链接列表的内容打印或写入日志文件。 如果没有泄漏,您的链表应该没有条目,但如果有一些泄漏,那么日志文件会为您提供内存分配位置的确切位置。

请注意,在使用这个宏技巧时,你会丢失哪些函数提供的类型检查,但这是我使用很多次的一个巧妙的小技巧。

希望这会有所帮助和所有最好的:)

Valgrind是你需要的。

我记得读过Nutshell中的算法的第一章,虽然它没有包含代码,但它还是讨论了这个问题。 刚添加,以防您觉得有趣。

由于c中没有运算符重载,我们可以覆盖malloc函数点来拦截对malloc的调用并跟踪内存分配

实际上,你可以。 读取LD_PRELOAD。

除了@ Als的回答将包含你的源代码中的调用,如果你正在使用gnu ld ,你可以让链接器在链接时包装所有调用(可能是mallocrealloccallocfree ),而不管在哪里他们来自。 然后编写__wrap_malloc等,并可以使用例如__real_malloc调用原始函数。

请参阅http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html中的 --wrap=symbol

我不知道这对共享库的调用是如何工作的。 我猜它没有。

以下是如何修改malloc,free hooks: Malloc的钩子

使用Xilinx Zynq baremetal使用Xilinx SDK gcc为我工作的mallinfofunction。 我测试了故意内存泄漏 – 我不知道为什么但谷歌的结果是非常可怕的找到这个解决方案传播这个词来帮助其他开发人员!