Я хотел бы знать, как оператор delete определяет ячейку памяти, которая должна быть освобождена, когда ей задан указатель базового класса, который отличается от истинной ячейки памяти объекта.
Я хочу дублировать это поведение в своем собственном распределителе/деаллокаторе.
Рассмотрим следующую иерархию:
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" фактически указывают на разные адреса из-за того, как объект выложен в памяти, а оператор удаления "знает", как найти и освободить правильное расположение памяти.
Я знаю, что в общем случае невозможно определить размер полиморфного объекта с указателем базового класса: узнать размер полиморфного объекта, Я подозреваю, что вообще невозможно найти истинное местоположение памяти объекта.
Примечания:
- Мой вопрос не связан с тем, как работают новые [] и delete []. Меня интересует случай выделения одного объекта. Как удалить [] "знать" размер массива операндов?.
- Меня не беспокоит, как называется деструктор. Меня интересует освобождение самой памяти. Как "удалить" работает, когда я удаляю указатель базового класса
- Я тестировал с использованием -fno-rtti и -fno-exceptions, поэтому g++ не должен иметь доступ к информации типа времени выполнения.