Очевидно, что ответ нет, C++ в любом случае автоматически вызовет деструктор базового класса. Но что, если мы попытаемся позвонить? Насколько я понимаю, результат будет зависеть от того, можно ли вызвать деструктор базового класса дважды, не вызывая ошибочного поведения.
Например, в этом случае:
Код: Выделить всё
class BaseSafe {
public:
~BaseSafe()
{
}
private:
int data;
};
class DerivedSafe {
public:
~DerivedSafe()
{
BaseSafe::~BaseSafe();
}
};
Но в данном случае:
Код: Выделить всё
class BaseUnsafe {
public:
BaseUnsafe()
{
buffer = new char[100];
}
~BaseUnsafe ()
{
delete[] buffer;
}
private:
char* buffer;
};
class DerivedUnsafe {
public:
~DerivedUnsafe ()
{
BaseUnsafe::~BaseUnsafe();
}
};
Похоже, во втором случае UB легко избежать. Просто установите для буфера нулевой указатель после удаления[].
Но поможет ли это? Я имею в виду, что деструктор, как ожидается, будет запускаться только один раз для полностью созданного объекта, поэтому оптимизатор может решить, что установка для буфера нулевого указателя не имеет смысла, и исключить этот код, подвергая программу двойному удалению.
Разрешено ли это компилятору?
Подробнее здесь: https://stackoverflow.com/questions/276 ... o-be-calle