C ++内存泄漏与unordered_map

时间:2013-09-17 22:49:08

标签: c++ memory-leaks stl

我发现我的应用程序中某处存在内存泄漏,但我一直在缩小范围。我已按照this example中的说明尝试使用_CrtDumpMemoryLeaks功能,但它没有显示文件名。因此,我一直试图通过在各个点放置对此转储函数的调用来找到内存泄漏的第一点(因为根据输出似乎有很多)。似乎我很早就在我的构造函数中直接获得了很多对象。

经过进一步的调查,我似乎得到了std::unordered_map的定义,甚至到了一个简单的主函数只是声明一个局部变量有内存泄漏。

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

void main()
{
    _CrtDumpMemoryLeaks(); // executing this line, no memeory leaks found

    std::unordered_map<int, int> intMap;

    _CrtDumpMemoryLeaks(); // executing this line, memeory leaks found
}

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

所以你期望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 ++库仍然可以在其内存分配机制中保留一些内存。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

当您释放了已分配的所有内容时,调用_CrtDumpMemoryLeaks才有意义。

正如其他答案所述,范围内有unordered_map,此对象已分配内存。一旦它消失了,分配将随之而来。所以将它包装在一个范围内!