0

我确实对使用delete p. 在大多数情况下,如果我们会调用某些东西,我们会在析构函数中调用 delete,int *p = new int (10);但是根据下面的代码片段(delete p 的原始代码),它已经调用了析构函数,然后调用运算符 delete,那么为什么我们应该在析构函数中调用 delete p .

原始代码:

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

我们将 delete 称为内部析构函数的代码片段

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

3 回答 3

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
    }
    ...
};
于 2013-03-06T09:22:07.703 回答
0

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

于 2013-03-06T09:45:32.267 回答
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。

于 2013-03-06T09:16:02.113 回答