Страницы

Поиск по вопросам

понедельник, 3 декабря 2018 г.

Нужно ли писать пустой виртуальный деструктор?

Как известно, при необходимости удаления через указатель на родительский класс, класс должен иметь виртуальный деструктор, чтобы оператор delete вызвал верный деструктор дочернего класса.
Но что если лично мне вообще не нужен деструктор ни в одном из классов? Являются ли автоматически сгенерированные деструкторы взаимозаменяемыми? Или я всё равно обязан добавить виртуальный деструктор в родительский класс?
Насколько я понимаю, генерируется пустой деструктор, поэтому при уничтожении объекта ничего происходить не будет. Да и вообще, компилятор умный и вызов пустой функции выкинет, соответственно, никакой деструктор при удалении вызываться не будет.
В таком случае кажется странным необходимость добавлять виртуальную функцию, которая будет вызываться, если эта функция заведомо является nopом.
https://ideone.com/8ldKsU
struct A { int x; A(unsigned x) : x(x) {} };
struct B : A { B() : A(7) {} };
int main() { A *a = new B(); delete a;
return 0; }


Ответ

Ответ на этот вопрос по сути совпадает с этим ответом. Виртуальным деструктор может стать только при наследовании или явном указании, больше никак. Компилятор генерирует деструктор, который должен удалить все объекты, т.е. «пустой» это не верно в общем случае. В стандарте нет исключений для этого случая, код в вопросе даёт неопределённое поведение согласно стандарту.
Дополнительно, пустой с точки зрения исходного кода деструктор на деле не является пустым, в него вкладывается логика по деаллокации экземпляра класса. Поэтому деструкторы разных классов по сути являются разными, не взаимозаменяемыми.

Комментариев нет:

Отправить комментарий