Я столкнулся с этим второстепенным вопросом, с которым я обычно отклонял бы «не делай этого«, но я не смог найти удовлетворительный ответ в стандарте и был бы признателен, если бы кто-то мог указать на причину:
Предположим, у меня есть класс, который выбрасывает исключение в деструкторе:
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, который, кажется, не освободить память автоматически. (Сравните это с исключениями в конструктор, в этом случае гарантированно вызывается функция освобождения (если она существует).)
Стандарт гласит (5.3.5p7):
Если значение операнда удалить выражение не является нулевым значением указателя, удалить выражение вызовет функцию освобождения. В противном случае не определено, будет ли вызвана функция освобождения. [Примечание: функция освобождения вызывается независимо от того, генерирует ли деструктор для объекта или некоторого элемента массива исключение. — конец примечания]
Записка отвечает на ваш вопрос.
Других решений пока нет …