我不太确定我理解虚拟析构函数和在堆上分配空间的概念。让我们看下面的例子:
class Base
{
public:
int a;
};
class Derived : public Base
{
public:
int b;
};
我想如果我做这样的事情
Base *o = new Derived;
在堆上分配了 8 个字节(或系统需要的任何两个整数),看起来像这样: ... | 一个 | 乙 | ...
现在,如果我这样做:
delete o;
为了从堆中删除所有内容,“删除”如何知道实际上是哪种类型 o?我想它必须假设它是 Base 类型,因此只从堆中删除 a (因为它不能确定 b 是否属于对象 o): ... | 乙 | ...
然后 b 将保留在堆上并且无法访问。
执行以下操作:
Base *o = new Derived;
delete o;
真正引起内存泄漏,我需要一个虚拟析构函数吗?还是 delete 知道 o 实际上属于 Derived 类,而不是 Base 类?如果是这样,它是如何工作的?
多谢你们。:)