删除调用析构函数吗?

我有一个类(A)为其中一个字段使用堆内存分配。 类A被实例化并作为指针字段存储在另一个类(B)中。

当我完成对象B时,我打电话给删除,我认为这是调用析构函数......但是这是否也调用类A中的析构函数?

编辑:

从答案中可以看出(如果不正确,请修改):

  • delete B实例B调用B ::〜B();
  • 它调用A::~A();
  • and A::~A应该明确地delete and A::~A所有堆分配成员变量;
  • 最后将存储所述B实例的内存块返回给堆 - 当使用new时,它首先在堆上分配一块内存,然后调用构造函数对其进行初始化,现在在调用所有析构函数完成对象之后将对象所在的块返回给堆。

  • A的析构函数将在其生命周期结束时运行。 如果你想让它的内存被释放并且析构函数运行,那么如果它被分配到堆上,你必须删除它。 如果它被分配到堆栈上,这会自动发生(即当它超出范围时,请参阅RAII)。 如果它是一个类的成员(不是一个指针,而是一个完整的成员),那么当包含对象被销毁时会发生这种情况。

    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
    

    在上面的例子中,每个删除和删除[]都是必需的。 并且不需要删除(或确实可以使用),我不使用它。

    auto_ptrunique_ptrshared_ptr等等对于使这种生命周期管理更容易:

    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
    

    它被命名为“析构函数”,而不是“解构函数”。

    在每个类的析构函数内部,你必须删除已经用new分配的所有其他成员变量。

    编辑:澄清:

    假设你有

    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;
    }
    

    分配B的实例然后删除是干净的,因为B在内部分配的内容也将在析构函数中被删除。

    但是类C的实例会泄漏内存,因为它分配了一个它不会释放的实例(在这种情况下,C甚至没有析构函数)。

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

    上一篇: Does delete call the destructor?

    下一篇: Does using "new" on a struct allocate it on the heap or stack?