此函数是否会在 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
时,都会发生以下情况
- 在 "free store" 中为地图对象分配了内存。
- 使用初始化列表调用地图的构造函数。
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 值优化)。
下面的函数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
时,都会发生以下情况
- 在 "free store" 中为地图对象分配了内存。
- 使用初始化列表调用地图的构造函数。
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 值优化)。