C++;:std:在main()中设置内存泄漏 微软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; } #包括 #包括 #包括 #定义\u CRTDBG\u映射\u ALLOC 使用名称空间std; int _tmain(int argc,_TCHAR*argv[] { printf(“我在泄漏”\n); std::集s; _CrtDumpMemoryLeaks(); 返回0; }

C++;:std:在main()中设置内存泄漏 微软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; } #包括 #包括 #包括 #定义\u CRTDBG\u映射\u ALLOC 使用名称空间std; int _tmain(int argc,_TCHAR*argv[] { printf(“我在泄漏”\n); std::集s; _CrtDumpMemoryLeaks(); 返回0; },memory,stl,set,memory-leaks,Memory,Stl,Set,Memory Leaks,运行程序后,您将获得如下输出: 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: <

运行程序后,您将获得如下输出:

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;
}
检测到内存泄漏!
转储对象->
0x005E9C68处的{209}正常块,20字节长。
数据:689C5E00689C5E00689C5E00689C5E00CD
0x005E9C20处的{208}正常块,8字节长。
数据:<;>F8 FE 3B 00 00 00 00
对象转储完成。
解决方法如下:只需将定义用大括号括起来,如下所示:

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;
}
int-tmain(int-argc,_-TCHAR*argv[]
{
printf(“我不再泄漏了”\n);
{
std::集s;
}
_CrtDumpMemoryLeaks();
返回0;
}

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

第一个示例是如何泄漏的
s
仍在作用域中,因此它当然仍有与其关联的内存。您必须在
\u tmain
返回后调用内存泄漏检测以获得有效答案

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


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

第一个示例是如何泄漏的
s
仍在作用域中,因此它当然仍有与其关联的内存。您必须在
\u tmain
返回后调用内存泄漏检测以获得有效答案

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


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

是的,您完全正确!所以一点错误都没有:)是的,你绝对是正确的!所以根本没有bug:)