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
构造取得指针的所有权并且内存将被泄露.