有没有办法防止内存泄漏而不要求开发人员在C ++中特别注意它

时间:2012-02-23 09:02:23

标签: c++ memory-leaks

目前,我们有几种方法可以防止内存泄漏,例如

  1. proxy(shared_ptr,auto_ptr)和
  2. 簿记方法,
  3. 垃圾收集(java)
  4. 但前者需要开发人员的大量开销,后者会导致很多资源开销。

    还有其他方法可以提高资源效率并让开发人员摆脱这个问题吗?

3 个答案:

答案 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();
....
};