我不明白一件事。比如,我声明了类A和类B,其中类B是类A的子类:
class A {
public:
int a;
}
class B : public A {
public:
int b;
}
显然,如果我创建A或B的实例,它们在内存中的大小可以由类型确定。
A instanceA; // size of this will probably be the size of int (property a)
B instanceB; // size of this will probably be twice the size of int (properties a and b)
但是如果我创建动态实例,然后稍后释放它们呢?
A * instanceAPointer = new A();
A * instanceBPointer = new B();
这些是不同类的实例,但程序会将它们视为类A的实例。在使用它们时没有问题,但是如何释放它们呢?为了释放已分配的内存,程序必须知道要释放的内存大小,对吗?
所以如果我写
delete instanceAPointer;
delete isntanceBPointer;
程序如何知道每个指针所指的地址开始,应该释放多少内存?因为显然,对象的大小不同,但程序将它们视为类型A。谢谢。
delete
永远不会使用 RTTI。虚析构函数的存在通过 vtable 处理了标识问题。 - rubenvb