我想知道当给定一个与对象的真实内存位置不同的基类指针时,删除运算符如何计算出需要释放的内存位置。
我想在我自己的自定义分配器/释放器中复制这种行为。
考虑以下层次结构:
struct A
{
unsigned a;
virtual ~A() { }
};
struct B
{
unsigned b;
virtual ~B() { }
};
struct C : public A, public B
{
unsigned c;
};
我想分配一个 C 类型的对象并通过 B 类型的指针删除它。据我所知,这是对 operator delete 的有效使用,它在 Linux/GCC 下工作:
C* c = new C;
B* b = c;
delete b;
有趣的是,指针'b'和'c'实际上指向不同的地址,因为对象在内存中是如何布局的,而删除操作符“知道”如何找到和释放正确的内存位置。
我知道,一般来说,在给定基类指针的情况下,不可能找到多态对象的大小:找出多态对象的大小。我怀疑通常也无法找到对象的真实内存位置。
笔记:
- 我的问题与 new[] 和 delete[] 的工作方式无关。我对单个对象分配案例感兴趣。delete[] 如何“知道”操作数数组的大小?.
- 我也不关心如何调用析构函数。我对内存本身的释放感兴趣。当我删除基类的指针时“删除”如何工作
- 我使用 -fno-rtti 和 -fno-exceptions 进行了测试,因此 G++ 不应访问运行时类型信息。