Microsoft Visual C++(VS 2008/2010)では、std :: setやstd:vectorのようないくつかの標準テンプレートライブラリコンテナを使用して、次のようなメモリリークが発生します。C++:std:main()内のメモリリークを設定する
#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システムでこれを試してみたのであれば、知りたいことは興味深いでしょう...
はい、あなたは絶対に厳格です!だから全くバグはありません:) – Knasterbax