最终审判
既然修改了代码,再用
valgrind 运行一次:
泄漏已修复
你运行了和刚刚一样的测试数据,但这次程序清理了堆上的所有东西。
你破案了吗?即使这次没能发现泄漏并修复它也不用担心,存储器泄漏是 C 程序中最难发现的错误。事实上,现在你用的很多 C 程序都隐藏着一些存储器错误,所以 valgrind 工具就非常有用。
- 发现泄漏。
- 定位泄漏。
- 检验泄漏是否修复。
这里没有蠢问题
问:
valgrind 说泄漏的存储器是在第 46 行创建的,但我们却修改了另一行代码,为什么?答:虽然数据“Loretta...”是由第 46 行代码放到堆上的,但泄漏却发生在变量(current->question )重新赋值的那一刻,因为当时变量指向的“Loretta...”还没有释放。创建数据不会发生泄漏,只有当程序失去了所有对数据的引用才会导致泄漏。问:我的 Mac/Windows/FreeBSD 系统可以安装 valgrind 吗?答:在 上可以查看 valgrind 最新发行版的详细信息。 http://valgrind.org 问:那么 valgrind 是怎么拦截 malloc() 与 free() 的?答:malloc() 和 free() 包含在 C 标准库中,而 valgrind 有一个库,里面有它自己的 malloc() 与 free() 。当用 valgrind 运行程序时,程序会使用 valgrind 的函数,而不是 C 标准库中的函数。问:为什么编译器在编译代码时不默认包含调试信息?答:因为调试信息会使可执行文件变大,同时也可能让程序变得更慢。问:valgrind 这个名字的由来是什么?答:valgrind 是英灵殿入口的名字,而 valgrind(程序)为你打开了一扇通向计算机堆的大门。11 北欧神话中,死亡之神奥丁用来款待阵亡将士英灵的殿堂。——译者注
要点
valgrind 可以检查存储器泄漏。
valgrind 通过拦截对 malloc() 与 free() 的调用来工作。
程序在停止运行时,valgrind 会打印留在堆上数据的详细信息。
编译代码时,如果在可执行文件中加上调试信息,valgrind 可以提供更多信息。
多次运行程序可以缩小泄漏的范围。
valgrind 可以告诉你源文件的哪行代码把数据放到了堆上。
valgrind 可以用来检验泄漏是否已修复。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论