[c++] 刪除調用析構函數嗎?



Answers

當你調用由new分配的指針的delete時,指向的對象的​​析構函數將被調用。

A * p = new A;

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

我有一個類(A)為其中一個字段使用堆內存分配。 類A被實例化並作為指針字段存儲在另一個類(B)中。

當我完成對象B時,我打電話給刪除,我認為這是調用析構函數......但是這是否也調用類A中的析構函數?

編輯:

從答案中可以看出(如果不正確,請修改):

  1. delete B實例B調用B ::〜B();
  2. 它調用A::~A();
  3. and A::~A 應該明確地delete and A::~A所有堆分配成員變量;
  4. 最後將存儲所述B實例的內存塊返回給堆 - 當使用new時,它首先在堆上分配一塊內存,然後調用構造函數對其進行初始化,現在在調用所有析構函數完成對象之後將對象所在的塊返回給堆。



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成員將不會被釋放。 刪除它們也會調用它們的析構函數。




不,指針將被刪除。 您應該在B的析構函數中明確地調用A上的刪除。




如果你有一個通常的指針( A* ),那麼析構函數將不會被調用(並且內存實例也不會被釋放),除非你在B的析構函數中顯式地delete 。 如果你想自動銷毀看看智能指針,如auto_ptr




不,它不會調用類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;
  }



Related