2011-01-20 13 views
4

のVisual C++はので、私は私ができるように、最も単純なテストケースとそれを絞り込まとこれを得た私のコ​​ードでメモリリークが見つかりました:stringはメモリリークを引き起こしますか?

#define _CRTDBG_MAP_ALLOC // required 
#include <stdlib.h>   // to enable MSVC++ 
#include <crtdbg.h>   // memory leak detection 

#include <string> 

using namespace std; 

int main() { 

    string foo; 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 

出力:

Detected memory leaks! 
Dumping objects -> 
{130} normal block at 0x008748A8, 8 bytes long. 
Data: B4 F9 44 00 00 00 00 00 
Object dump complete.

を私は「文字列fooのをコメントアウトした場合; "それは何も検出しません。

私は何とかFOOの割り当てを解除する必要がありますか。

答えて

10

あなたはあまりにも早く_CrtDumpMemoryLeaks()を実行しているし、それがリークとしてstring体を報告します。すべてのローカルオブジェクトが破棄された後にのみ実行してください。

いずれかの個別の機能

void doStuff() 
{ 
    string variable; 
} 

またはネストされたスコープを追加するには、すべて意味のある仕事をラップ:

int main() 
{ 
    { 
     string variable; 
    } 
    _CrtDumpMemoryLeaks(); 
    return 0; 
} 
+0

あなたはどちらの任意のスタックベースのオブジェクトを持っている場合は明らかに不可能です! '_CrtDumpMemoryLeaks()'は* C *ランタイムライブラリからのものです。それはデストラクタを予期していなかった... –

+2

@Oli:不可能な方法? sharptoothはそれを行う方法を示しました。 –

+0

は、今私は私が間違ってやっていたかを把握しようとしているので、多くの時間を無駄にするためにしてばかな質問であることが判明したものを尋ねるために愚かな感じ。説明ありがとう。 – zi3guw

2

文字列がまだ存在している間あなたは_CrtDumpMemoryLeaks();を呼び出している - もちろんそれはまだ文字列のことを検出存在する!

これを試してください:あなたがプログラム/ブロック終了後_CrtDumpMemoryLeaksを呼び出す必要があります

#define _CRTDBG_MAP_ALLOC // required 
#include <stdlib.h>   // to enable MSVC++ 
#include <crtdbg.h>   // memory leak detection 

#include <string> 

using namespace std; 

int main() { 
    {  
     string foo; 
    } 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 
9

。すべてのメモリが アプリケーションによって割り当てられていることを確認するために頻繁にプログラムの実行 の最後に呼び出され

_CrtDumpMemoryLeaks:_CrtDumpMemoryLeaks msdn articleに述べたようにそれを行うための最善の方法は、プログラム終了時に CRT呼び出しこと自体を持っています解放されました。 関数は_CrtSetDbgFlag関数を用い_crtDbgFlagフラグ 上の_CRTDBG_LEAK_CHECK_DFビットフィールドを回転させることにより自動的に プログラム終了時に呼び出すことができます。

あなたがやった方法、それを呼び出すことによって、それが実行ブロックがまだ終了していないので、まだ呼び出されていない デストラクタだから、それはリークとしてFOOを検出します。

+1

@ Shinnokさんの答えを明らかにするために、 '_CrtDumpMemoryLeaks()'を直接呼び出すのではなく、プログラムにこの行を追加して自動的に呼び出させてください: '_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);' – GrahamS

+1

@GrahamS漏れ:Pありがとう。 – Ricky

関連する問題