C++成语避免内存泄漏?

War*_*ior 0 c++

在以下代码中,如果Info::addPart1()多次意外调用,则会发生内存泄漏:

typedef struct
{
}part1;

typedef struct
{
}part2;

class Info
{
    private:
    part1* _ptr1;
    part2* _ptr2;    

    public:
    Info()
    {
      _ptr1 = _ptr2 = NULL;
    }

    ~Info()
    {
      delete _ptr1; 
      delete _ptr2;
    }

    addPart1()
    {
       _ptr1 = new part1;         
    }

    addPart2()
    {
      _ptr2 = new part2;         
    }   
};


Info _wrapper;
_wrapper.addPart1();
_wrapper.addPart2();
Run Code Online (Sandbox Code Playgroud)

有没有C++成语来处理这个问题?

我可以改写addPart1addPart2喜欢这样来保卫MLK

addPart1()
{
  if(_ptr1 != NULL) delete _ptr1;
  _ptr1 = new part1;         
}
Run Code Online (Sandbox Code Playgroud)

这是一个好的解决方案吗?

J.W*_*.W. 10

使用诸如boost:shared_ptr之类的智能指针,建议使用boost:scoped_ptr来管理原始指针.auto_ptr很难处理,你需要注意这一点.


the*_*row 5

您应该阅读有关智能指针习惯用法RAII的内容.我建议看看新的技术报告(TR1).
好好看看这里这里.
还要看看boost的智能指针.
我推荐loki-lib的SmartPtr或StrongPtr类.


tim*_*day 5

在这里忍受我......

在遥远的过去,程序员使用像"jump"和"goto"这样的结构来进行流量控制.最终出现了常见的模式和构造类似于,do/while,函数调用和try/catch出现,意大利面被驯服.这些命名结构提供了有关intent的更多信息,而不是泛型goto,您必须检查上下文的其余代码以了解它正在做什么.在不太可能的情况下,你会看到一个有能力的编码员在现代代码中看到一个goto,你知道一些非常不寻常的事情正在发生.

在我看来,"删除"是内存管理的"转向".现代开发人员可以使用足够多的智能指针和容器类,大多数代码都没有理由包含单个显式删除(当然,除了智能指针实现之外).当你看到一个简单的"删除"时,你得不到关于意图的信息; 当你看到scoped_ptr/auto_ptr/shared_ptr/ptr_container时,你会得到更多.

即成语应该是希望通过使用适当的智能指针类型来编写无删除代码(这里几乎所有其他答案都推荐).

更新2013-01-27:我注意到Herb Sutter 关于C++ 11精彩演讲包括一些类似的情绪,重新删除免费代码.