3
BaseClass * p = new DerivedClass();
delete p;

我知道第二行将调用基类的析构函数,如果它没有虚拟析构函数,如果有,则调用派生类的析构函数,但会delete正确释放内存(假设BaseClass对象占用 8 个字节的空间和DerivedClass的一个 12 - 它会释放 8 或 12 个字节)并在任何一种情况下摆脱对象?

4

2 回答 2

5

好吧,如果它有一个virtual析构函数,当然该对象将被销毁并且内存按预期释放。如果它没有virtual析构函数,则行为未定义。

如果待删除对象的静态类型与其动态类型不同,则静态类型应为待删除对象动态类型的基类,且静态类型应具有虚析构函数或行为未定义。

因此,尝试推理内存是否将被完全释放并没有任何意义。程序可以对内存做任何它喜欢的事情。

于 2013-05-11T14:50:18.623 回答
2

如果析构函数不是虚拟的,delete则不会删除派生类。

我试过这个:

#include<iostream>

using namespace std;

class Base {
public:
    Base() {
        cout<<"Creating base."<<endl;
    }

    ~Base() {
        cout<<"Killing base."<<endl;
    }
};

class Derived: public Base {
public:
    Derived() {
        cout<<"Creating derived."<<endl;
    }

    ~Derived() {
        cout<<"Killing derived."<<endl;
    }
};

int main() {
    Base *p = new Derived();
    delete p;
    return 0;
}

在 G++ 4.7.3 上编译(默认优化),我得到

Creating base.
Creating derived.
Killing base.

注意没有Killing derived.

于 2013-05-11T14:58:03.740 回答