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

Mar*_*tin 3 c++ c++11 c++14 c++17

在最近的一篇文章中,我读到以下使用std :: map ::\templace可能会泄漏内存,但我不明白为什么:

// 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));
Run Code Online (Sandbox Code Playgroud)

谁能解释一下?

Pra*_*ian 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));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将一个原始指针传递给emplace该函数,并依赖该函数将指针的所有权转移给一个unique_ptr.如果函数在分配新节点期间抛出,则不unique_ptr构造取得指针的所有权并且内存将被泄露.

  • 这样的事情当然是`make_unique`*存在*的原因之一. (5认同)