Почему происходит утечка памяти в этом коде, когда выдается исключение bad_alloc для T2 - PullRequest
0 голосов
/ 03 ноября 2019

Если T2 должен был выдать, почему это вызвало бы утечку памяти у T1?

// В некотором заголовочном файле: void f (T1 *, T2 *);

// На каком-то сайте вызова: f (новый T1, новый T2);

1 Ответ

2 голосов
/ 03 ноября 2019

Если конструктор второго объекта выдает исключение, то f() вызываться не будет, поэтому у кода внутри f() не будет ни шанса удалить первый созданный объект, ни сохранить указательк этому объекту для последующего удаления.

Аналогичным образом, код, который может выполняться после возникновения исключения (например, в любом блоке обработчика catch, который вы, возможно, настроили для обработки исключения), не будет иметь доступана указатель на любой объект, поэтому он не сможет удалить созданный объект.

Следовательно, более или менее (*) неизбежно, что объект будет протекать в этом сценарии.

(Обратите внимание, что неизвестно, какой аргумент функции будет оценен первым, поэтому с таким же успехом это может быть T1(), который выбрасывает после создания T2, вызывая утечку объекта T2)

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

...