Нет, утечки памяти нет. C++ гарантирует, что если во время конструктора Fred в выражении p = new Fred() произойдёт исключение, выделенная память автоматически вернётся в кучу.
Выражение new Fred() состоит из двух отдельных шагов:
sizeof(Fred) байт через примитив operator new(size_t nbytes)Компилятор C++ автоматически оборачивает эти шаги в обработку исключений. Генерируемый код функционально эквивалентен:
Fred* p = (Fred*) operator new(sizeof(Fred));
try {
new(p) Fred(); // Placement new - вызывает конструктор
} catch (...) {
operator delete(p); // Освобождаем память
throw; // Пробрасываем исключение дальше
}
p становится параметром this внутри конструктора Fred::Fred()catch автоматически вызывает operator delete(p) для освобождения памятиnew; оно не применяется к памяти, выделенной вручную через operator new, которую ты конструируешь самостоятельноТакое поведение обеспечивает exception safety, предотвращая утечки памяти при ошибках конструктора.
Когда new Fred() выбрасывает исключение во время конструирования, компилятор автоматически генерирует код для вызова operator delete() на выделенной памяти перед тем, как переbросить исключение.
Новый — ещё не проверен сообществом
Вы