如何在C程序中找到内存泄漏的最佳方法

4

我正在尝试完成一项大学作业,评分标准规定了5%的内存管理 - 具体指没有内存泄漏。

据我所知,在简单的C程序中,内存泄漏只会由程序中已被放弃的指针引起 - 即调用malloc / calloc等函数但没有相应的free

我的问题分为三个部分:

  1. 在Solaris和OSX上,证明你没有泄漏任何内存的最简单方法是什么?
  2. XCode有没有工具来帮助确定内存泄漏?
  3. 操作系统是否会在进程结束时释放所有先前分配的内存?

2
第一项听起来比较复杂。这也意味着你需要为你的fopen使用fclose,为你的createFoo()使用destroyFoo()。 - Mel
不是回答你的问题,但值得一提的是:你的教练对内存泄漏的理解可能与现实世界中的情况不同。未释放的分配数量有限(独立于程序处理的任何数据),虽然会被像valgrint这样的工具捕获,但并不是真正的内存泄漏;而依赖数据的分配在数据不再使用后仍然存在,并且只在程序退出时才被清除,真正的泄漏,尽管没有任何工具可以检测到它们。 - R.. GitHub STOP HELPING ICE
你可以尝试使用Deleaker,但它仅适用于Windows。 - MastAvalons
4个回答

5

1
我似乎无法在OSX上构建Valgrind,并且似乎没有任何二进制文件。有没有替代方案? - Ash
1
brew install valgrind 警告您需要 OS X Mavericks 或更早版本. 这是 OSX 10.9. 当前版本为 10.10.4. - Nick Desaulniers
不确定我能对此做些什么。 (?) - Alex Reynolds

3
  1. 每个malloc()函数都需要确保只有一个free()函数。
  2. 我没有使用过XCode,但是这个论坛帖子可能会有所帮助。
  3. 是的。但是,让你的程序“泄漏”仍然是不好的形式。

总的来说,学习如何避免内存泄漏而不使用内存调试器(尤其是对于简单的程序)是一个好主意。然而,当涉及到构建任何非平凡的东西时,您将想开始学习如何使用更高级的调试工具(例如Valgrind,就像Alex Reynolds在另一个回答中建议的那样)。


在提及其他答案时,不要使用“上面”或“下面”这样的词语,因为答案的顺序是不固定的。可以使用“Alex的答案”这样的表述。 - cjm

2

针对Mac OS的问题和一个需要避免的例子(为您节省半小时)。


Mac OS没有Valgrind或dmalloc。此外,在Sierra中安装Valgrind时,Valgrind存在一些兼容性问题。

有一个名为“leaks”的实用程序,我通过以下方式使其运行:

Original Answer 翻译成“最初的回答”

leaks -atExit --/Contents/Developer/usr/lib/libLeaksAtExit.dylib ./a.out

不幸的是,这个工具无法报告明显的内存泄漏......也许我使用方法不对,但我只是在寻找一种简单的方式来检查我的C程序是否正确释放了内存。
如果你有时间,可以试试阅读并使用Using OSX Leaks for C Programs on the Command Line? 资源:
  1. 查找内存泄漏
  2. 在C/C++可执行文件上使用“leaks”命令
附注:也许与“iprofiler”一起使用会有用,但我没有安装它。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接