在最近的article中,我读到以下对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));
有人可以解释吗?
答案 0 :(得分:13)
如果说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
来获取指针的所有权,并且内存将被泄漏。