这个函数是否在C++中创建内存泄漏? 下面的函数MaMaGMAP是否构成了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();

这个函数是否在C++中创建内存泄漏? 下面的函数MaMaGMAP是否构成了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();,c++,memory-leaks,C++,Memory Leaks,我的理解是,多次重复调用此函数将导致许多地图被分配到免费商店。我的推理是,每次调用make_map时,都会发生以下情况 内存在空闲存储器中分配给映射对象。 使用初始值设定项列表调用映射的构造函数。 my_映射是从动态分配的映射复制构建的。 在我看来,这似乎构成了内存泄漏,因为make_映射中动态分配的映射从未超出范围,所以它的析构函数从未被调用,空闲存储内存也从未被释放。因此,调用此函数100次将导致在免费存储中分配此映射的100个副本。这是正确的吗 此函数是否在C++中产生内存泄漏? std:

我的理解是,多次重复调用此函数将导致许多地图被分配到免费商店。我的推理是,每次调用make_map时,都会发生以下情况

内存在空闲存储器中分配给映射对象。 使用初始值设定项列表调用映射的构造函数。 my_映射是从动态分配的映射复制构建的。 在我看来,这似乎构成了内存泄漏,因为make_映射中动态分配的映射从未超出范围,所以它的析构函数从未被调用,空闲存储内存也从未被释放。因此,调用此函数100次将导致在免费存储中分配此映射的100个副本。这是正确的吗

此函数是否在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();
对。您分配了new,并丢弃了指针。它无法再恢复,因此无法删除,因此内存已泄漏

你的推理也是正确的

此函数是否在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();
对。您分配了new,并丢弃了指针。它无法再恢复,因此无法删除,因此内存已泄漏


你的推理也是正确的。

是的,这是一个漏洞。由于按值返回,函数返回的对象是使用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中得到优化。

是的,这是一个泄漏。由于按值返回,函数返回的对象是使用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中得到优化。

简短的回答是肯定的:只需使用Return std::map{a,1};去掉*新部分。简短的回答是肯定的:只需使用return std::map{a,1};把新零件处理掉。