16

私は、Visual Studio 2010 で SDL を使用してゲームに取り組んでいます_CrtDumpMemoryLeaks()。マクロに出くわし、やってみようと思いました。呼び出す_CrtDumpMemoryLeaks()と、メモリ リークが出力ウィンドウに出力されますが、発生した場所は表示されません。

Memory Leak Detection Enableで MSDN の記事を読みましたが、定義する_CRTDBG_MAP_ALLOCと、問題のあるステートメントの行番号を出力する必要があると説明されています。これは私の場合には起こりません。(ただし、'new' を使用するのではなく、malloc() を直接使用すると、動作させることができました)。

コード:

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

int main(int argc, char *argv[]) {
    int *var = new int(5);

    _CrtDumpMemoryLeaks();

    return 0;
}

出力は次のとおりです。

Detected memory leaks!
Dumping objects ->
{58} normal block at 0x007D1510, 4 bytes long.
 Data: <    > 05 00 00 00 
Object dump complete.

「new」を使用して割り当てるときに行番号を出力できない場合_CrtDumpMemoryLeaks()は、同様の動作を実現するための他の方法を提案してください。

4

5 に答える 5

9

_DEBUGを定義して含めると、配置式でファイル番号と行番号を指定するために使用できる追加のパラメーターを<crtdbg.h>受け取るオーバーロードが発生します。operator newnew

例えば

int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5);

これを条件付きで定義されたマクロでラップできます。

#ifdef _DEBUG
#define DEBUG_NEW_PLACEMENT (_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW_PLACEMENT
#endif

int* p = new DEBUG_NEW_PLACEMENT int(5);

このフォームクライアントコードを完全に非表示にするマクロを定義している人を見かけますがnew、これは、placement newを使用してすでに意図的に何かを壊し、placement newを使用しているヘッダー(多くの標準ヘッダーなど)を確認する必要があるため、個人的にはお勧めしません。ヘッダーを再定義する前に含まれnewます。これにより、ヘッダーファイルでのインライン使用を「調整」せずに簡単にnewすり抜けることができます。

于 2010-07-08T12:18:09.637 に答える
9

これは旧バージョンの Visual Leak Detector です。

これを試してください:http://vld.codeplex.com/

于 2010-07-08T10:40:49.333 に答える
3

インクルード後にこれらの定義が必要になる場合があります


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
于 2010-07-08T10:15:28.697 に答える
2

コードの一部を確認してください。

operator new と operator delete をオーバーロードして、すべてのメモリ割り当てと割り当て解除をログに記録する

この方法を使用してメモリ リークを特定しました。

于 2010-07-08T12:06:49.803 に答える