繁体   English   中英

C ++内存泄漏与unordered_map

[英]C++ memory leaks with unordered_map

我发现在我的应用程序中某处存在内存泄漏,但我一直在缩小范围。 我已尝试按照此示例中的说明使用函数_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 ,这个对象已经分配了内存。 一旦它消失了,分配将随之而来。 所以将它包装在一个范围内!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM