我不太确定我理解虚析构函数和在堆上分配空间的概念。让我们看一下以下示例:
class Base
{
public:
int a;
};
class Derived : public Base
{
public:
int b;
};
我想象如果我这样做的话。
Base *o = new Derived;
在堆上分配了8个字节(或者系统需要的两个整数),看起来像这样:
... | a | b | ...
现在,如果我这样做:
delete o;
'delete' 如何知道 o 的实际类型以便从堆中删除所有内容?我想它必须假设它是 Base 类型,因此只能从堆中删除 a(因为不能确定 b 是否属于对象 o):... | b | ...
然后 b 将留在堆中且无法访问。
以下代码是否可以解决这个问题:
Base *o = new Derived;
delete o;
这段代码是否真的会引起内存泄漏,我需要在这里使用虚析构函数吗?或者delete知道o实际上是Derived类而不是Base类吗?如果是这样的话,它是如何工作的呢?
谢谢大家。 :)
o
应该是一个指针,就像Base* o
一样。 - David Gdelete
调用了未定义的行为。 - Luchian Grigore