Почему std :: map :: emplace использует утечку памяти? - PullRequest
0 голосов
/ 17 декабря 2018

В недавней статье я читал, что следующее использование std :: map :: emplace может привести к утечке памяти, но я не понимаю, почему:

// might leak if allocation fails due to insufficient memory for an object A
std::map<int, std::unique_ptr<A>> m;
m.emplace(1, std::make_unique<A>("Ann",63));

Может кто-нибудь объяснить

1 Ответ

0 голосов
/ 17 декабря 2018

Отправленный вами фрагмент не вызовет утечку памяти, если, скажем, выделение нового узла с помощью map завершится неудачно из-за нехватки памяти.Вы создали unique_ptr перед вызовом map::emplace, поэтому, если эта функция сгенерирует, unique_ptr будет delete A и позволит избежать утечки.

Что автор предположительно подразумевает, что следующий код будет утекатьпамять в аналогичных условиях

std::map<int, std::unique_ptr<A>> m;
m.emplace(1, new A("Ann",63));

В этом случае вы передаете необработанный указатель на emplace и полагаетесь на функцию для передачи владения указателем на unique_ptr.Если функция выбрасывает во время выделения нового узла, unique_ptr не был бы создан для того, чтобы стать владельцем указателя, и в памяти произошла утечка.

...