Разрешено ли оптимизатору компилятора C++ нарушать способность моего деструктора вызываться несколько раз?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Разрешено ли оптимизатору компилятора C++ нарушать способность моего деструктора вызываться несколько раз?

Сообщение Anonymous »

Однажды у нас было интервью с очень опытным разработчиком C++, который не смог ответить на следующий вопрос: нужно ли вызывать деструктор базового класса из деструктора производного класса в C++?

Очевидно, что ответ нет, C++ в любом случае автоматически вызовет деструктор базового класса. Но что, если мы попытаемся позвонить? Насколько я понимаю, результат будет зависеть от того, можно ли вызвать деструктор базового класса дважды, не вызывая ошибочного поведения.

Например, в этом случае:

Код: Выделить всё

class BaseSafe {
public:
~BaseSafe()
{
}
private:
int data;
};

class DerivedSafe {
public:
~DerivedSafe()
{
BaseSafe::~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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»