1

私は VS 2008 でしばらく C++ プロジェクトに取り組んできました。最近まで、アプリケーションを終了すると、出力ウィンドウにメモリ リークがあるかどうかが表示されていました。しかし、数日前に、この貴重な情報が表示されなくなったことに気付きました。また、いくつかのprintf()を投げてみましたが、出力ウィンドウにもそれが表示されていません。

どこかで設定を変更したと思いますが、見つけられないようです。出力に表示されるのは、ロード/アンロードされた dll だけです。何か案は?

ありがとう、マイク

4

1 に答える 1

0

私自身の経験から、メモリ リークの出力が失われるのは、さまざまな理由が原因である可能性があります。最も重要なものを要約すると:

  1. ソースコードの変更:

    • メモリ リーク レポートを無効にする (つまり、_CrtSetDbgFlagを使用)
    • カスタム レポート フックをインストールします ( _CrtSetReportHook、_CrtSetReportHook2を参照) 。
    • 出力をファイルにリダイレクトします ( CrtSetReportModeを参照)。
    • アプリケーションの終了時にサイレント「クラッシュ」につながるソースコードの変更 - アプリケーションは、メモリリークが報告されるポイントに到達する前に、問題を示すことなくサイレントに終了します (ありそうもないことですが、これは私が一度経験したように見えるかもしれません)。
  2. 開発環境の設定により、出力が別のウィンドウにリダイレクトされます。ツール\オプション\デバッグ\全般\すべての出力ウィンドウのテキストをイミディエイト ウィンドウ (下から 5 番目) にリダイレクトします。おそらく他の可能性がここに存在します。

ポイント 2 を除外する 1 つの可能性は、(main.cpp) の行で単純なコンソール アプリケーションを作成することだと思います。

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    _CrtSetDbgFlag(nOldState | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    int *pInt = new int[100];
    return 0;
}

このアプリケーションを実行するとメモリ リークが正しく出力される場合、残念ながらケース 1 に該当する可能性があります。

もちろん、出力がなくなる可能性がある明白な理由を除外しました (それらのいくつかは既にコメントで言及されています)。

于 2011-09-20T09:11:29.050 に答える