2012-01-12 4 views
1

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システムでこれを試してみたのであれば、知りたいことは興味深いでしょう...

答えて

5

最初の例はどのようにリークですか? sは依然として有効範囲にありますので、もちろんそれに関連付けられたメモリはまだあります。あなたは有効な答えを得るために_tmainが返された後にメモリリークの検出を行う必要があります。

2番目の例では、sが範囲外で破棄されているため、メモリがそれ以上関連付けられていないことは驚くことではありません。

あなたのコード内のリークチェッカーを呼び出すだけで意味があります。

+0

はい、あなたは絶対に厳格です!だから全くバグはありません:) – Knasterbax

関連する問題