此函数是否会在 C++ 中造成内存泄漏?

Does this function create a memory leak in C++?

下面的函数make_map是否构成C++中的内存泄漏?

std::map<std::string, std::string> make_map() {
    return *new std::map<std::string, std::string> { "a", "1" };
}

for (int i = 0; i < 100; i++)
    auto my_map = make_map();

据我了解,多次重复调用此函数会导致这些地图中的许多被分配给 "free store"。我的推理是,每次调用 make_map 时,都会发生以下情况

  1. 在 "free store" 中为地图对象分配了内存。
  2. 使用初始化列表调用地图的构造函数。
  3. my_map 是从动态分配的映射构造的副本。

在我看来,这似乎构成了内存泄漏,因为 make_map 中动态分配的映射永远不会超出范围,因此永远不会调用它的析构函数,并且永远不会释放自由存储内存。因此调用此 100 次将导致在 "free store" 中分配此映射的 100 个副本。这是正确的吗?

Does this function create a memory leak in C++?

是的。您分配了 new,并丢弃了指针。无法再恢复,因此永远无法删除,因此内存已泄漏。

你的推理也是对的。

是的,这是一个漏洞。由于您 return 按值 return 由函数编辑的对象是您使用 new 创建的对象的副本,因此您无法再访问该新对象以将其删除从而具有内存泄露。如果您通过引用切换到 returning 然后捕获该引用,那么您可以像

一样删除它
std::map<std::string, std::string>& make_map() {
    return *new std::map<std::string, std::string> { "a", "1" };
}

for (int i = 0; i < 100; i++)
{
    auto& my_map = make_map();
    // stuff
    delete &my_map;
}

但是你不应该那样设计你的代码。相反,你只想要

std::map<std::string, std::string> make_map() {
    return {{"a", "1"}};
}

这不会导致泄漏,并保证在 C++17 中进行 RVO(Return 值优化)。