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

C++ 为什么std::map::emplace使用会泄漏内存?,c++,c++11,c++14,c++17,C++,C++11,C++14,C++17,在最近的一篇文章中,我读到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)); //如果由于对象A的内存不足而导致分配失

在最近的一篇文章中,我读到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));
//如果由于对象A的内存不足而导致分配失败,则可能会泄漏
std::map m;
m、 安置(1,标准::使_独特(“安”,63));

有人能解释一下吗?

如果
映射分配新节点由于内存不足而失败,那么您发布的代码片段不会导致内存泄漏。在调用
map::emplace
之前,您已经构造了一个
unique\u ptr
,因此如果该函数抛出,那么
unique\u ptr
删除一个
并避免泄漏

作者大概的意思是,以下代码在类似条件下会泄漏内存

std::map<int, std::unique_ptr<A>> m;
m.emplace(1, new A("Ann",63));
std::map m;
m、 安置(1,新A(“安”,63));

在这种情况下,您将原始指针传递到
emplace
,并依赖函数将指针的所有权转移到
unique\u ptr
。如果函数在分配新节点时抛出,则不会构造任何
unique\u ptr
来获取指针的所有权,内存将泄漏。

我认为作者需要解释这个有问题的语句是的。。。事实并非如此。提醒一下,如果你不询问不同版本的特殊性,你不需要为它们添加标签。当然,像这样的事情是
make_unique
存在的原因之一。