有什么一般性质的技巧可以确保我在C++程序中不会泄漏内存? 我如何确定谁应该释放动态分配的内存?
有什么一般性质的技巧可以确保我在C++程序中不会泄漏内存? 我如何确定谁应该释放动态分配的内存?
尽可能地使用用户智能指针!这样可以消除整个类别的内存泄漏。
在您的项目中分享和了解内存所有权规则。使用COM规则可以获得最佳的一致性([in]参数由调用方拥有所有权,被调用方必须复制; [out]参数由调用方拥有所有权,如果保留引用,则被调用方必须进行复制等)。
Valgrind是一个很好的工具,可以在运行时检查程序的内存泄漏问题。
它可用于大多数Linux版本(包括Android)和Darwin。
如果您习惯为程序编写单元测试,那么您应该养成系统地在测试中运行Valgrind的习惯。这将有可能在早期阶段避免许多内存泄漏问题。通常在简单测试中定位问题比在完整软件中更容易。
当然,这个建议同样适用于任何其他内存检查工具。
此外,如果存在std库类(例如vector),请勿使用手动分配的内存。如果违反此规则,请确保有一个虚析构函数。
allocate
if allocation succeeded:
{ //scope)
deallocate()
}
这很显然,但请确保在作用域中输入任何代码之前先输入它。
按重要性顺序的技巧:
- 技巧#1:始终记得声明您的析构函数“虚拟的”。
- 技巧#2:使用RAII。
- 技巧#3:使用boost的智能指针。
- 技巧#4:不要编写自己的有缺陷的智能指针,使用boost(在我正在处理的项目上,我无法使用boost,并且我必须调试我的智能指针,我肯定不会再采用同样的方法,但无论如何,现在我不能将boost添加到我们的依赖项中)
- 技巧#5:如果是一些休闲/非性能关键(例如具有数千个对象的游戏),请查看Thorsten Ottosen的boost指针容器。
- 技巧#6:为您选择的平台找到泄漏检测头文件,例如Visual Leak Detection的“vld”头文件。
仅适用于MSVC,请在每个.cpp文件的顶部添加以下内容:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
然后,当使用VS2003或更高版本进行调试时,你将在程序退出时被告知任何泄漏情况(它跟踪new/delete)。虽然简单,但这在过去对我有所帮助。
valgrind(仅适用于*nix平台)是一个非常好的内存检查器