下面的函数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
时,都会发生以下情况
- 在 map 对象的“空闲存储”中分配内存。
- 使用初始化列表调用 map 的构造函数。
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/