[c++] deleteはデストラクタを呼び出しますか?


Answers

newによって割り当てられたポインタでdeleteを呼び出すと、指されているオブジェクトのデストラクタが呼び出されます。

A * p = new A;

delete p;    // A:~A() called for you on obkect pointed to by p
Question

私はそのフィールドの1つにヒープメモリ割り当てを使用するクラス(A)を持っています。 クラスAは、インスタンス化され、別のクラス(B)にポインタフィールドとして格納されます。

私がオブジェクトBで終わったら、私はデストラクタを呼び出すと仮定してdeleteを呼び出します...しかし、これはクラスAのデストラクタを呼び出しますか?

編集:

答えから、私はそれを取る(間違っている場合は編集してください):

  1. Bのインスタンスを delete B ::〜B();
  2. A::~A();を呼び出しA::~A();
  3. and A::~Aすべてのヒープ割り当てメンバー変数を明示的にdelete 必要があります。
  4. 最後に、Bのインスタンスを格納しているメモリブロックがヒープに返されます。 新しいものが使用されたときにヒープ上にメモリブロックが割り当てられ、次にコンストラクタが呼び出されて初期化されます。ブロック内のオブジェクトがヒープに戻されます。



通常のポインタ( A* )を持っていれば、 Bのデストラクタで明示的にdeleteを行わない限り、デストラクタは呼び出されません( Aインスタンスのメモリも解放されません)。 自動破壊をauto_ptrようなスマートポインタで見たい場合。




いいえ、ポインタは削除されます。 Bのデストラクタで明示的にAの削除を呼び出す必要があります。




class B
{
public:
    B()
    {
       p = new int[1024];  
    }
    virtual ~B()
    {
        cout<<"B destructor"<<endl;
        //p will not be deleted EVER unless you do it manually.
    }
    int *p;
};


class D : public B
{
public:
    virtual ~D()
    {
        cout<<"D destructor"<<endl;
    }
};

あなたがするとき:

B *pD = new D();
delete pD;

デストラクタは、基本クラスにvirtualキーワードがある場合にのみ呼び出されます。

あなたが仮想デストラクタを持っていなかったなら、〜B()だけが呼び出されます。 しかし、あなたは仮想デストラクタを持っているので、まず〜D()が呼び出され、〜B()が呼び出されます。

ヒープ上に割り当てられたBまたはDのメンバーは、明示的に削除しない限り、割り当て解除されません。 そしてそれらを削除すると、デストラクタも呼び出されます。




それはクラスAのデストラクタを呼び出さないでしょう。あなたは明示的に(PoweRoyが言ったように)それを呼び出す必要があります。 'delete ptr;'行を削除してください。 例を比較する...

  #include <iostream>

  class A
  {
     public:
        A(){};
        ~A();
  };

  A::~A()
  {
     std::cout << "Destructor of A" << std::endl;
  }

  class B
  {
     public:
        B(){ptr = new A();};
        ~B();
     private:
        A* ptr;
  };

  B::~B()
  {
     delete ptr;
     std::cout << "Destructor of B" << std::endl;
  }

  int main()
  {
     B* b = new B();
     delete b;
     return 0;
  }



Links