В 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-системе, было бы интересно узнать ...