在析构函数中删除p执行

时间:2013-03-06 09:13:34

标签: c++ memory-management delete-operator

我确实怀疑使用delete p。在大多数情况下,我们在析构函数中调用delete,如果我们调用了int *p = new int (10);,但是根据下面的代码片段(delete p的原始代码),它已经调用析构函数然后调用operator delete然后我们应该调用它们在析构函数中删除p。

原始代码:

delete a;
if (a != NULL) {
  a->~A();
  operator delete(a);
}

我们称之为删除内部析构函数的代码片段

class B
{
  int *a;
  public:
  B()
  {
    a=new int(90);
  }
  ~B()
  {
    cout<<"B's destructor";
    delete a;
  }
  void dial()
  {
    cout<<"dial the tone";
  }
}

3 个答案:

答案 0 :(得分:1)

不要那样做!这是双重破坏和双重免费

delete a;             // calls destructor and then frees the memory
if (a != NULL) {
  a->~A();            // calls destructor again
  operator delete(a); // frees memory again
}

这个没问题,因为你在构造函数中分配了内存

~B()
{
    cout<<"B's destructor";
    delete a;
}

使用,您可以使用std::unique_ptr代替

class B
{
    std::unique_ptr<int> a;
public:
    B() : a(new int(90));
    {
    }
    ~B()
    {
        cout<<"B's destructor";
        // std::unique_ptr will take care of memory
        // no delete a neccessary
    }
    ...
};

答案 1 :(得分:0)

功能operator deletedelete expression不相同。默认的operator delete只释放内存,但表达式在释放内存之前调用析构函数。阅读http://en.cppreference.com/w/cpp/language/delete

delete a;
if (a != NULL) {
  a->~A();
  operator delete(a);
}

非常非常奇怪的片段。这里有UB。

答案 2 :(得分:0)

在新动态分配内存的所有地方,我们需要使用 operator delete 来释放内存。请检查下面提到的链接中的说明。 http://en.cppreference.com/w/cpp/memory/new/operator_delete