Если конструктор второго объекта выдает исключение, то f()
вызываться не будет, поэтому у кода внутри f()
не будет ни шанса удалить первый созданный объект, ни сохранить указательк этому объекту для последующего удаления.
Аналогичным образом, код, который может выполняться после возникновения исключения (например, в любом блоке обработчика catch
, который вы, возможно, настроили для обработки исключения), не будет иметь доступана указатель на любой объект, поэтому он не сможет удалить созданный объект.
Следовательно, более или менее (*) неизбежно, что объект будет протекать в этом сценарии.
(Обратите внимание, что неизвестно, какой аргумент функции будет оценен первым, поэтому с таким же успехом это может быть T1()
, который выбрасывает после создания T2
, вызывая утечку объекта T2
)
(*) Полагаю, вы могли бы сделать что-то сумасшедшее, например, заключительная строка в ваших конструкторах T1()
и T2()
хранит свои this
-показатели в статическом dгде-то ata-структура, но это было бы очень уродливо и привело бы к ряду других проблем;правильное решение этой проблемы - использовать std::unique_ptr
или подобное для «захвата» объектов, так что явный вызов delete
никогда не требуется, и, следовательно, утечка памяти невозможна независимо от того, когда генерируется исключение.