【发布时间】:2016-10-05 12:24:13
【问题描述】:
我不明白一件事。例如,我声明类 A 和类 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 类型的。
谢谢
【问题讨论】:
-
也许这个链接会有所帮助? openrce.org/articles/files/jangrayhood.pdf
-
实际上,看起来第二个可能会导致内存泄漏,因为它不是多态类。如果类是多态的,编译器能够根据动态类型释放它,无论是使用 RTTI 还是其他方法,并自动释放实际分配的相同数量的内存。但是,如果该类不是多态的,我不相信它能够保证能够正确处理这种情况,因此您应该始终通过正确类型的指针将其删除。
-
@JustinTime 你所说的多态类是指带有虚拟析构函数的类吗?
-
@Justin:
delete永远不会使用 RTTI。虚拟析构函数的存在负责通过 vtable 进行标识。 -
@JustinTime 是的,这就是为什么人们总是说在客户端可能通过多态指针删除的任何类中实现虚拟析构函数,以便可以查找正确的派生 dtor 并执行。
标签: c++ oop object inheritance dynamic-memory-allocation