Исключение в деструкторе динамического объекта

Я столкнулся с этим второстепенным вопросом, с которым я обычно отклонял бы «не делай этого«, но я не смог найти удовлетворительный ответ в стандарте и был бы признателен, если бы кто-то мог указать на причину:

Предположим, у меня есть класс, который выбрасывает исключение в деструкторе:

struct Foo { ~Foo() { throw std::runtime_error("Catch this!"); } };

Что происходит с динамически выделяемой памятью, если я удаляю динамически размещенный экземпляр этого класса?

auto p = new Foo;

try { delete p; }
catch (std::exception const &) { }

Вызывается ли функция освобождения или нет? И почему? Могу ли я сделать этот код правильным, добавив operator delete(p); в catch блок?

Я провел небольшой тест с GCC, который, кажется, не освободить память автоматически. (Сравните это с исключениями в конструктор, в этом случае гарантированно вызывается функция освобождения (если она существует).)

3

Решение

Стандарт гласит (5.3.5p7):

Если значение операнда удалить выражение не является нулевым значением указателя, удалить выражение вызовет функцию освобождения. В противном случае не определено, будет ли вызвана функция освобождения. [Примечание: функция освобождения вызывается независимо от того, генерирует ли деструктор для объекта или некоторого элемента массива исключение. — конец примечания]

Записка отвечает на ваш вопрос.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector