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

機能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 に答える
0

new がメモリを動的に割り当てるすべての場所で、演算子 deleteを使用してメモリを解放する必要があります。以下のリンクの説明を確認してください。 http://en.cppreference.com/w/cpp/memory/new/operator_delete

于 2013-03-06T09:45:32.267 に答える