Утечка памяти вызывает неопределенное поведение?

Это обсуждение возникло в комментариях к другому сообщению.

Образец кода:

#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) не используется для освобождения хранилища, деструктор не должен вызываться неявно, и любая программа, которая зависит от побочных эффектов, производимых деструктором имеет неопределенное поведение.


person M.M    schedule 10.06.2014    source источник
comment
О, так оно и есть. Это в основном дубликат, хотя здесь обсуждается использование удаленных указателей, что является совершенно отдельной проблемой.   -  person M.M    schedule 10.06.2014
comment
Думаю, заголовок stackoverflow.com/questions/21110059/ - лучший дублирующий кандидат здесь.   -  person ecatmur    schedule 10.06.2014