Как оператор удаления C++ находит место в памяти полиморфного объекта?

Я хотел бы знать, как оператор удаления определяет место в памяти, которое необходимо освободить, когда ему дается указатель базового класса, который отличается от истинного места в памяти объекта.

Я хочу продублировать это поведение в своем собственном распределителе/распределителе.

Рассмотрим следующую иерархию:

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» на самом деле указывают на разные адреса из-за того, как объект расположен в памяти, а оператор удаления «знает», как найти и освободить правильную ячейку памяти.

Я знаю, что в общем случае невозможно найти размер полиморфного объекта по указателю базового класса :. Узнать размер полиморфного объекта . Я подозреваю, что найти истинное местонахождение объекта в памяти вообще невозможно.

Примечания:

28
задан Community 23 May 2017 в 11:56
поделиться