我不太确定我了解虚拟析构函数以及在堆上分配空间的概念。让我们看下面的例子:
class Base
{
public:
int a;
};
class Derived : public Base
{
public:
int b;
};
我想如果我做这样的事情
Base *o = new Derived;
在堆上分配了8个字节(或系统上需要的两个整数),看起来像这样:
... |一个| b | ...
现在,如果我这样做:
delete o;
“删除”如何知道实际上是哪种类型的o才能从堆中删除所有内容?我猜想它必须假设它的类型为Base,因此只能从堆中删除a(因为不能确定b是否属于对象o):
... | b | ...
然后b将保留在堆上并且不可访问。
请执行以下操作:
Base *o = new Derived;
delete o;
真正引起内存泄漏,我这里需要虚拟析构函数吗?还是delete知道o实际上是Derived类的,而不是Base类的?如果是这样,那该如何运作?
谢谢你们。 :)
最佳答案
您正在对实现进行很多假设,这可能
或可能不成立。在delete
表达式中,动态类型必须为
与静态类型相同,除非静态类型具有虚拟
析构函数。否则,它是未定义的行为。期。那是
真的,您需要了解的所有内容-我已经在
否则至少在某些情况下它会崩溃;我已经用过
这样做会破坏可用空间的实现,因此
代码将在以后的某个时间崩溃,这是一个完全不相关的部分
代码。 (根据记录,VC++和g++都属于第二种情况,
至少在使用已发布代码的常规选项进行编译时)。