我想知道delete操作符如何在给出与对象的真实内存位置不同的基类指针时计算出需要释放的内存位置.
我想在我自己的自定义分配器/解除分配器中复制此行为.
考虑以下层次结构:
struct A
{
unsigned a;
virtual ~A() { }
};
struct B
{
unsigned b;
virtual ~B() { }
};
struct C : public A, public B
{
unsigned c;
};
Run Code Online (Sandbox Code Playgroud)
我想分配一个C类型的对象,并通过类型B的指针删除它.据我所知,这是一个有效的使用operator delete,它在Linux/GCC下工作:
C* c = new C;
B* b = c;
delete b;
Run Code Online (Sandbox Code Playgroud)
有趣的是,指针'b'和'c'实际上指向不同的地址,因为对象在内存中的布局方式,而删除操作符"知道"如何查找和释放正确的内存位置.
我知道,一般来说,在给定基类指针的情况下找不到多态对象的大小是不可能的:找出多态对象的大小.我怀疑通常不可能找到对象的真实内存位置.
笔记: