【发布时间】:2013-05-06 02:05:01
【问题描述】:
BaseClass * p = new DerivedClass();
delete p;
我知道如果基类没有虚拟析构函数,第二行将调用基类的析构函数,如果有,则调用派生类的析构函数,但 delete 会正确释放内存(假设为 BaseClass' s 对象占用 8 个字节的空间,DerivedClass 的一个 12 - 它会释放 8 个或 12 个字节)并在任何一种情况下都摆脱该对象?
【问题讨论】:
-
你熟悉
malloc/free语义吗? -
Re: “调用基类的析构函数”——也许吧。如果通过指向基类型的指针删除派生类型的对象,并且基类型没有虚拟析构函数,则行为未定义。它可能会调用基类的析构函数,但这不是必须的。
-
@NPS 请注意,值得一提的是,如果您在堆栈上创建了 DerivedClass 对象(即 - DerivedClass d;),那么 BaseClass Dtor 是否为虚拟并不重要- 它们中的两个(都是 Dtor 的)将按照与它们的构造相反的顺序被调用(即 - DerivedClass 和 BaseClass )。