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

时间:2018-12-17 00:46:50

标签: c++ c++11 c++14 c++17

在最近的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));

有人可以解释吗?

1 个答案:

答案 0 :(得分:13)

如果说map由于内存不足而分配新节点失败,则您发布的代码段不会导致内存泄漏。您已经在调用unique_ptr之前构造了map::emplace,所以如果该函数抛出,则unique_ptrdelete A并避免泄漏。

作者可能是指以下代码在类似情况下会泄漏内存

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

在这种情况下,您要传递指向emplace的原始指针,并依靠该函数将指针的所有权转移到unique_ptr。如果该函数在分配新节点期间抛出,则不会构造任何unique_ptr来获取指针的所有权,并且内存将被泄漏。