其他分享
首页 > 其他分享> > c – 指向子类的指针上的delete是否调用基类析构函数?

c – 指向子类的指针上的delete是否调用基类析构函数?

作者:互联网

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

当我完成了B类的一个对象时,我调用了delete,我假设它调用了析构函数……但这是否也调用了类A的析构函数?

编辑:

从答案中,我接受了(请编辑,如果不正确):

>删除B调用B ::〜B()的实例;
>调用A :: ~A();
> A ::〜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_ptr,unique_ptr和shared_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

标签:base-class,c,destructor,memory-management,delete-operator
来源: https://codeday.me/bug/20190917/1809599.html