2

我发现我的应用程序中某处存在内存泄漏,但我在缩小范围时遇到了麻烦。我已尝试按照此示例_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
}

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

很感谢任何形式的帮助。

4

3 回答 3

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++ 库可能仍会在其内存分配机制中保留一些内存池。

于 2013-09-17T22:53:49.690 回答
5

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

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

于 2013-09-17T22:53:43.067 回答
3

只有_CrtDumpMemoryLeaks当你释放了你分配的所有东西时调用才有意义。

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

于 2013-09-17T22:56:31.083 回答