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