我有一个相当复杂的系统,运行着 30 个应用程序。一个相当复杂的 C++ 应用程序正在泄漏内存,我想我已经修复了它。
到目前为止我所做的是:
- 我使用valgrind 的 memcheck执行了应用程序,它没有检测到任何问题。
- 我使用htop监视了应用程序,我注意到虚拟内存和剩余内存没有增加
- 我打算运行valgrind 的地块,看看它是否使用新内存
问题是,我怎样才能确保没有泄漏?我想如果虚拟内存停止增加,那么我可以确定没有泄漏。当我测试我的应用程序时,我触发了多次分配和释放内存的循环以确保。
我有一个相当复杂的系统,运行着 30 个应用程序。一个相当复杂的 C++ 应用程序正在泄漏内存,我想我已经修复了它。
到目前为止我所做的是:
问题是,我怎样才能确保没有泄漏?我想如果虚拟内存停止增加,那么我可以确定没有泄漏。当我测试我的应用程序时,我触发了多次分配和释放内存的循环以确保。
如果 valgrind 不报告泄漏,则在无法访问的内存区域的意义上没有泄漏(在您检查的运行期间)。这并不意味着程序不分配内存,使用它并且在不再使用它时不释放它(但它仍然可以访问)。例如,考虑一个典型的待办事项堆栈,您将新项目放在顶部,处理顶部的项目,然后推送另一个。永远不会回到旧的,所以用于它们的内存被浪费了,但从技术上讲它不是泄漏。
您可以做的是监视进程的内存使用情况。如果它稳步增加,您可能会在那里遇到问题(真正的泄漏,或者某些不需要增长的数据结构)。
如果这不是真的很紧迫,从长远来看,它可能会更便宜,只是让它......
除非您确切地知道应用程序将分配新内存的所有条件,否则您无法确定。如果您不能诱发所有这些情况,则 valgrind 和 htop 都不会保证您的应用程序在所有情况下都不会泄漏内存。
但是,您至少应该确保应用程序在正常情况下不会泄漏内存。
您需要使用一个名为 Valgrind 的工具。它是适用于 Linux 和 Mac OS X 操作系统的内存调试、内存泄漏检测和分析工具。Valgrind 是一个灵活的程序,用于调试和分析 Linux 可执行文件。按照步骤..
只需安装 valgrind
运行... ./a.out arg1 arg2
现在如何使用此命令行打开详细的内存泄漏检测器: valgrind --leak-check=yes ./a.out arg1 arg2 valgrind --leak-check=yes /path/to/myapp arg1 arg2
或者您也可以设置日志文件: valgrind --log-file=output.file --leak-check=yes --tool=memcheck ./a.out arg1 arg2
您可以检查其日志以查找内存泄漏错误... cat output.file