Это обсуждение появилось в комментариях к другому сообщению.
Пример кода:
#include <string>
void func()
{
std::string* foo;
foo = new std::string[125];
throw 1;
delete [] foo;
}
int main()
{
try { func(); }
catch(int x) {}
}
Вызывает ли эта программа поведение undefined? Утверждалось, что это UB под §3.8 p4, что:
Программа может завершить время жизни любого объекта, повторно используя хранилище, которое занимает объект, или явно вызвав деструктор для объекта типа класса с нетривиальным деструктором. Для объекта типа класса с нетривиальным деструктором программа не требует прямого вызова деструктора до того, как хранилище, которое объект занимает, повторно используется или освобождается; однако, если нет явного вызова деструктора или если выражение удаления (5.3.5) не используется для освобождения хранилища, деструктор не должен быть неявно вызван и любая программа, зависящая от побочных эффектов, создаваемых деструктором имеет поведение undefined.