1

C++で書かれた大きなプロジェクトがあります。一部のGUIアクション(ボタンクリック)では、2MBのメモリが割り当てられます。これはメモリリークではありません。もちろん、メモリは後で解放されます。ただし、メモリ割り当てサイズを減らすために、どのオブジェクトが割り当てられているかを調査する必要があります。

だから私はdebugcrtを使おうとしました

OnBtnClick()
{
    //breakpoint1
    _CrtMemState s1;
    _CrtMemCheckpoint( &s1 );

        //The logic itself

    _CrtMemDumpAllObjectsSince(&s1);
    _CrtMemState s2;
    _CrtMemCheckpoint( &s2 );
    _CrtMemState s3;
    if ( _CrtMemDifference( &s3, &s1, &s2) )
        _CrtMemDumpStatistics( &s3 );
    //breakpoint2
}

デバッグレポートには、400KBのみが割り当てられたと記載されています。ただし、2つのブレークポイント間のタスクマネージャーのプロセスメモリが2MB増加しました。

したがって、作成されたダンプは役に立ちません。残りのメモリ割り当てはどこにあるのか説明してもらえますか?

4

2 に答える 2

2

すべてのリクエストをファイルに記録する、オーバーロードされたグローバルなNew演算子とDelete演算子を作成する簡単なテストを試してください。静的グローバルの状態を使用して、ロギングのオン/オフを切り替えることができます。これにより、制御が期待できる各メモリ割り当てをログに記録するための手段が提供されます。

于 2012-08-07T14:20:32.340 に答える
0

不具合の原因が分かったようです。

ボタンをクリックすると、いくつかのリッチエディット ウィンドウ コントロールが作成され、データが入力されました。Windows はおそらく、ランタイムをバイパスしてメモリを割り当てます。そのため、dbgcrt レポートにその割り当てが表示されません。しかし、リッチエディット ハンドルを閉じると、メモリが正常に解放されます。

そのため、すべてのボタン クリックに対して 1 つの共通のリッチエディットを使用するようにします。

みんな助けてくれてありがとう!

于 2012-08-09T11:27:47.737 に答える