BaseClass * p = new DerivedClass();
delete p;
我知道第二行将调用基类的析构函数,如果它没有虚拟析构函数,如果有,则调用派生类的析构函数,但会delete
正确释放内存(假设BaseClass
对象占用 8 个字节的空间和DerivedClass
的一个 12 - 它会释放 8 或 12 个字节)并在任何一种情况下摆脱对象?
BaseClass * p = new DerivedClass();
delete p;
我知道第二行将调用基类的析构函数,如果它没有虚拟析构函数,如果有,则调用派生类的析构函数,但会delete
正确释放内存(假设BaseClass
对象占用 8 个字节的空间和DerivedClass
的一个 12 - 它会释放 8 或 12 个字节)并在任何一种情况下摆脱对象?
好吧,如果它有一个virtual
析构函数,当然该对象将被销毁并且内存按预期释放。如果它没有virtual
析构函数,则行为未定义。
如果待删除对象的静态类型与其动态类型不同,则静态类型应为待删除对象动态类型的基类,且静态类型应具有虚析构函数或行为未定义。
因此,尝试推理内存是否将被完全释放并没有任何意义。程序可以对内存做任何它喜欢的事情。
如果析构函数不是虚拟的,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.