я делаю небольшой эксперимент с виртуальными деструкторов для обзора - интересно, если кто имеет простое объяснение следующее (используя против 2010):Виртуальные деструкторы C++ в цепочке наследования уровня 4.
Я определяю иерархии классов ABCD, D наследует C, C наследует B, B наследует A, A - база;
провел 2 эксперимента:
Первый эксперимент -
А имеет виртуальный деструктор.
В имеет не-виртуальный деструктор
С имеет виртуальный деструктор
D имеет не виртуальный деструктор
// -------------- --------------
Отметьте 4 объекта на куче типа D - Наведите указатель на A *, B * и C * на первые 3 - Оставьте четвертый как D * для полноты. Удалить все 4 указателя.
Как и ожидалось, во всех четырех случаях целая цепь деструктора выполняется в обратном порядке от D до A, освобождая всю память.
Второй эксперимент -
А имеет не-виртуальный деструктор ** изменился к не виртуальной
B имеет не виртуальный деструктор
С имеет виртуальный деструктор
D имеет не виртуальный Distructor
Отметьте 4 объекта на куче типа D - Наведите указатель на A *, B * и C * на первые 3 - Оставьте четвертый как D * для полноты.
Удаление указателей C * и D *: целая цепь деструктора выполняется в обратном порядке от D до A, освобождая всю память.
Удаление B *: B, а затем деструктор запускается (утечка)
Удаление *: Только деструктор запускается (течи)
Может кто-нибудь объяснить, почему это?
Когда в эксперименте 2 выделены D-типы, его непосредственный базовый класс (C) имеет виртуальный деструктор - не сообщает ли компилятор его отслеживание с помощью Vptr и знает тип памяти? БЕСПЛАТНАЯ ссылка?
Благодаря Майк
Было бы здорово, если бы вы предоставили код примера. – Rook
@Rook Я опубликовал фрагмент кода, который иллюстрирует этот случай (почти идентично) - дайте мне знать, если есть какие-либо комментарии. –