【问题标题】:C++: std:set memory leaks in main()C ++:std:main()中的set内存泄漏
【发布时间】:2012-01-12 22:22:12
【问题描述】:

在 Microsoft Visual C++ (VS 2008/2010) 中使用许多标准模板库容器,如 std::set 或 std:vector,您将遇到内存泄漏:

#include <set>
#include <stdlib.h>
#include <crtdbg.h>
#define _CRTDBG_MAP_ALLOC

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    printf("I'm leaking\n");

    std::set<int> s;

    _CrtDumpMemoryLeaks();
    return 0;
}

运行程序后,你会得到如下输出:

Detected memory leaks!
Dumping objects ->
{209} normal block at 0x005E9C68, 20 bytes long.
 Data: <h ^ h ^ h ^     > 68 9C 5E 00 68 9C 5E 00 68 9C 5E 00 CD CD CD CD 
{208} normal block at 0x005E9C20, 8 bytes long.
 Data: <  ;     > F8 FE 3B 00 00 00 00 00 
Object dump complete.

解决方案如下:只需将定义括在大括号中,如下所示:

int _tmain(int argc, _TCHAR* argv[])
{
    printf("I'm not leaking any more\n");

    {
        std::set<int> s;
    }
    _CrtDumpMemoryLeaks();
    return 0;
}

这是一种奇怪的行为,我想知道这是 Microsoft 编译器中的错误还是某些 STL 问题?我猜是前者。如果有人在 Linux 系统上尝试过这个,知道会很有趣......

【问题讨论】:

    标签: memory stl set memory-leaks


    【解决方案1】:

    第一个示例如何泄漏? s 仍在范围内,所以当然它仍然有与之关联的内存。您必须在 _tmain 返回后进行内存泄漏检测调用才能获得有效答案。

    在您的第二个示例中,s 超出范围并已被销毁,因此它没有更多与之关联的内存也就不足为奇了。

    您只需要在代码中有意义的地方调用泄漏检查器。

    【讨论】:

    • 是的,你是绝对正确的!所以根本没有错误:)
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2010-10-11
    • 1970-01-01
    • 2016-01-27
    • 2010-11-11
    • 2017-02-18
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多