gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:33:05 28 4
gpt4 key购买 nike

下面的函数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();

据我了解,多次重复调用此函数会导致这些 map 中的许多被分配到“免费商店”。我的推理是,每次调用 make_map 时,都会发生以下情况

  1. 在 map 对象的“空闲存储”中分配内存。
  2. 使用初始化列表调用 map 的构造函数。
  3. my_map 是从动态分配的映射构造的拷贝。

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

最佳答案

是的,这是一个漏洞。由于您按值返回,因此函数返回的对象是您使用 new 创建的对象的拷贝,因此您无法再访问该新对象以将其删除,从而导致内存泄漏。如果您切换到通过引用返回然后捕获该引用,那么您可以像这样删除它

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(优化返回值)。

关于c++ - 此函数是否会在 C++ 中造成内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59144549/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com