目前,我们有几种方法可以防止内存泄漏,例如
但前者需要开发人员的大量开销,后者会导致很多资源开销。
还有其他方法可以提高资源效率并让开发人员摆脱这个问题吗?
答案 0 :(得分:7)
有没有办法防止内存泄漏而不要求开发人员在C ++中特别注意它?
使用最小动态分配,仅在必要时 如果您使用动态分配,则必须遵守其附带的价格并正确处理它。最好的方法是在C ++中使用 RAII ,请注意,编写RAII代码并非易事,但通过实践,人们习惯于以RAII方式思考。
答案 1 :(得分:0)
良好的编码练习成为良好的编程习惯然后很少注意"为了利用它们所必需的。我建议使用RAII包装器对象,例如std :: unique_ptr,std :: shared_ptr,以及关于何时何地应该使用动态分配的明确指南。
一个好的开始是,如果你看到有人输入单词delete
,那么它应该是一个你需要格外小心的标志。
这让我想到了第二点:不要使用动态分配(除非绝对必要),尽可能使用自动销毁的范围控制对象。永远不会new
RAII对象,这将迫使您考虑如果范围发生变化,应如何处理RAII所有者包装的对象。
例如:
std::auto_ptr<Foo> ptr2Foo( new Foo() );
...
...
if(ptr2Foo->isValidNow())
passToOwningObject(otherObject, ptr2Foo);
//now when scope ends the newed Foo will be destroyed or owned
//by an appropriate object.
或
std::unique_ptr<Foo> ptr2Foo( new Foo() );
...
...
if(ptr2Foo->isValidNow())
passToOwningObject(otherObject, std::move(ptr2Foo));
//now when scope ends the newed Foo will be destroyed or owned
//by an appropriate object.
定期运行代码anaylsis(MSVC,Valgrind,Coverity等...),不要忽略编译器警告。
答案 2 :(得分:0)
我一直觉得使用引用,返回并通过引用传递,并且尽可能准确地保持const正确性可以处理大部分内容。您无法删除引用,因此您不应该这样做。你不能删除一个const指针,所以你不应该这样做。然后在那些RARE场合,编码器会传递一个他们会注意到的非常量指针。
真正关注堆分配对象的所有权的想法,如果有的话,勉强揭露/暴露它们。
此外,编写更完整的界面以提供线索,例如:
class DataWrapper
{
public:
const BYTE* PeekAtData() const;
BYTE* RemoveData();
....
};