Does delete call the destructor?

I have an class (A) which uses a heap memory allocation for one of it's fields. Class A is instantiated and stored as a pointer field in another class (B).

When I'm done with object B, I call delete, which I assume calls the destructor... But does this call the destructor in class A as well?

Edit:

From the answers, I take that (please edit if incorrect):

  • delete instance of B calls B::~B();
  • which calls A::~A();
  • and A::~A should explicitly delete all heap-allocated member variables of A;
  • and finally the memory block storing said instance of B is returned to the heap - when new was used, it first allocated a block of memory on heap, then invoked constructors to initialize it, now after all destructors have been invoked to finalize the object the block where the object resided is returned to the heap.

  • The destructor of A will run when its lifetime is over. If you want its memory to be freed and the destructor run, you have to delete it if it was allocated on the heap. If it was allocated on the stack this happens automatically (ie when it goes out of scope; see RAII). If it is a member of a class (not a pointer, but a full member), then this will happen when the containing object is destroyed.

    class A
    {
        char *someHeapMemory;
    public:
        A() : someHeapMemory(new char[1000]) {}
        ~A() { delete[] someHeapMemory; }
    };
    
    class B
    {
        A* APtr;
    public:
        B() : APtr(new A()) {}
        ~B() { delete APtr; }
    };
    
    class C
    {
        A Amember;
    public:
        C() : Amember() {}
        ~C() {} // A is freed / destructed automatically.
    };
    
    int main()
    {
        B* BPtr = new B();
        delete BPtr; // Calls ~B() which calls ~A() 
        C *CPtr = new C();
        delete CPtr;
        B b;
        C c;
    } // b and c are freed/destructed automatically
    

    In the above example, every delete and delete[] is needed. And no delete is needed (or indeed able to be used) where I did not use it.

    auto_ptr , unique_ptr and shared_ptr etc... are great for making this lifetime management much easier:

    class A
    {
        shared_array<char> someHeapMemory;
    public:
        A() : someHeapMemory(new char[1000]) {}
        ~A() { } // someHeapMemory is delete[]d automatically
    };
    
    class B
    {
        shared_ptr<A> APtr;
    public:
        B() : APtr(new A()) {}
        ~B() {  } // APtr is deleted automatically
    };
    
    int main()
    {
        shared_ptr<B> BPtr = new B();
    } // BPtr is deleted automatically
    

    当你调用由new分配的指针的delete时,指向的对象的析构函数将被调用。

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

    It is named "destructor", not "deconstructor".

    Inside the destructor of each class, you have to delete all other member variables that have been allocated with new.

    edit: To clarify:

    Say you have

    struct A {}
    
    class B {
        A *a;
    public:
        B () : a (new A) {}
        ~B() { delete a; }
    };
    
    class C {
        A *a;
    public:
        C () : a (new A) {}        
    };
    
    int main () {
        delete new B;
        delete new C;
    }
    

    Allocating an instance of B and then deleting is clean, because what B allocates internally will also be deleted in the destructor.

    But instances of class C will leak memory, because it allocates an instance of A which it does not release (in this case C does not even have a destructor).

    链接地址: http://www.djcxy.com/p/14532.html

    上一篇: 内存分配:堆栈vs堆?

    下一篇: 删除调用析构函数吗?