为什么使用std::map::emplace会导致内存泄漏?

4
在我最近阅读的一篇文章中,作者提到以下使用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));

有人可以解释吗?


我认为作者需要解释这个有问题的陈述。 - Slava
2
是的...那不是真的。 - Barry
作为提醒,如果您不需要询问版本的细节,就不需要标记各个版本。 - Passer By
1个回答

13

如果由于内存不足而导致map未能分配新节点,那么您发布的代码片段不会导致内存泄漏。在调用map::emplace之前,您构造了一个unique_ptr,因此如果该函数抛出异常,unique_ptrdelete A并避免泄漏。

作者可能意味着类似情况下以下代码将会泄漏内存

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

在这种情况下,您正在将原始指针传递给emplace并依赖该函数将指针所有权转移给unique_ptr。如果在分配新节点期间函数抛出异常,则不会构造unique_ptr以接管指针的所有权,内存将泄漏。


5
当然,像这样的事情正是 make_unique 存在的原因之一。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接