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

标签 c++ memory-leaks

下面的函数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/

相关文章:

c++ - 找不到合适的阴影贴图深度偏差?

c++ - 大多数现代版本的 Linux 和 C/C++ 编译器是否已删除对 graphics.h header /库的支持?

c++ - 您如何合法地对舍入 double 执行 mod 运算符?

javascript继承同时节省内存

linux - 如何制定自由策略?

javascript - 如何在 Internet Explorer 中清理 JSONP 内存

释放 * 时 C++ 内存泄漏?

javascript - 警告 : connect. session() MemoryStore 不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程

c++ - 取消设置 glXMakeContextCurrent 时进程崩溃

c++ - 在 C++ 中传递非静态成员函数指针