Я хотел бы знать, как оператор удаления определяет место в памяти, которое необходимо освободить, когда ему дается указатель базового класса, который отличается от истинного места в памяти объекта.
Я хочу продублировать это поведение в своем собственном распределителе/распределителе.
Рассмотрим следующую иерархию:
struct A
{
unsigned a;
virtual ~A() { }
};
struct B
{
unsigned b;
virtual ~B() { }
};
struct C : public A, public B
{
unsigned c;
};
Я хочу выделить объект типа C и удалить его с помощью указателя типа B. Насколько я могу судить, это допустимое использование оператора удаления, и оно работает в Linux/GCC :
C* c = new C;
B* b = c;
delete b;
. Интересно то, что указатели «b» и «c» на самом деле указывают на разные адреса из-за того, как объект расположен в памяти, а оператор удаления «знает», как найти и освободить правильную ячейку памяти.
Я знаю, что в общем случае невозможно найти размер полиморфного объекта по указателю базового класса :. Узнать размер полиморфного объекта . Я подозреваю, что найти истинное местонахождение объекта в памяти вообще невозможно.
Примечания: