C++内存泄漏与unordered_map

C++ memory leaks with unordered_map

本文关键字:map unordered 内存 泄漏 C++      更新时间:2023-10-16

我发现我的应用程序中的某个地方有内存泄漏,但我在缩小范围时遇到了麻烦。 我尝试按照此示例中的说明使用函数_CrtDumpMemoryLeaks,但它不显示文件名。 因此,我一直试图通过在各个点调用此转储函数来找到内存泄漏的第一个点(因为根据输出似乎有很多)。 似乎我在对象的构造函数中很早就得到了很多。

经过进一步调查,我似乎正在为它们提供std::unordered_map的定义,甚至到了只有一个只声明局部变量的简单 main 函数有内存泄漏的地步。

例如,以下代码生成内存泄漏:

void main()
{
    _CrtDumpMemoryLeaks(); // executing this line, no memeory leaks found
    std::unordered_map<int, int> intMap;
    _CrtDumpMemoryLeaks(); // executing this line, memeory leaks found
}

在这一点上,我完全感到困惑,并觉得追逐这个不会帮助我找到我最初注意到的内存泄漏。

任何帮助都非常感谢。

所以你期望std::unordered_map<T>在你紧紧抓住一个对象时没有任何内存?这似乎是一个不合理的假设!至少,您应该销毁您创建的对象:

int main()
{
    _CrtDumpMemoryLeaks(); // executing this line, no memeory leaks found
    {
        std::unordered_map<int, int> intMap;
    }
    _CrtDumpMemoryLeaks(); // executing this line, memeory leaks found
}

我不知道这是否会释放所有内存,但它有更好的机会。标准C++库可能仍在其内存分配机制中保留一些内存池。

除了"已分配但尚未释放的内存"之外,内存泄漏的定义是什么?

如果 unordered_map 构造函数在内部分配任何内存,那么您就有了"泄漏"。尝试将其放在自己的范围内,看看是否得到相同的结果。

只有在释放了分配的所有内容后,调用_CrtDumpMemoryLeaks才有意义。

如其他答案所述,您的作用域中有一个unordered_map,并且此对象已分配内存。一旦它消失了,分配就会随之而去。所以把它包装在一个范围内!