0

VS2008 メモリ リーク ツールを使用しようとしていますが、まったくビルドできませんでした。

最も単純なシナリオはうまく機能しますが、CObject を使用しようとすると、コンパイルされません。

これがコードです(新しく作成されたコンソールアプリケーションです)

#include "stdafx.h"

#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif  // _DEBUG

#define _AFXDLL
#include "afx.h"

class DRV : public CObject {};

int _tmain(int argc, _TCHAR* argv[])
{
    DRV *d = new DRV;
}

この結果: エラー C2059: 構文エラー: afx.h の「定数」:

void* PASCAL operator new(size_t nSize);

#ifdef _DEBUG を #include "afx.h" の下に移動しようとすると、次のようになります。

error C2661: 'CObject::operator new' : no overloaded function takes 4 arguments

オンライン:

DRV *d = new DRV;

それで - 私は何を間違っていますか?ビルドイン VS2008 メモリ リーク ディテクターを使用できますか? 助けてください

4

1 に答える 1

1

ファイル DebugNew.h を作成し、次のコードを追加します。

#pragma once

#include "crtdbg.h"
#ifdef _DEBUG
#define DEBUG_NEW   new( _NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW
#endif

cpp ファイル内:

#include "stdafx.h"
#include "DebugNew.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif    

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

    char *d = new char[100];
}

DebugNew.hファイルはnew演算子を定義します。これにより、すべての割り当てにソース行情報を含めることができます。行は、デバッグ ビルドでのみ#define new DEBUG_NEWデフォルトnewをに再定義します。DEBUG_NEWこの行は#include、すべての .cpp ファイルのすべての行の後に配置する必要があります。CrtSetDbgFlagデバッグ ビルドでのメモリ リーク割り当てを有効にします。プログラムが終了すると、解放されていないすべての割り当てが出力されます。newoperator は再定義されているため、ソース行情報とともに出力されます。

MFC プロジェクトの場合は、行を追加するだけです

#ifdef _DEBUG
#define new DEBUG_NEW
#endif    

すべての .cpp ファイルに。他のすべてのことは、MFC によって既に行われています。MFC アプリケーション ウィザードによって作成された MFC プロジェクトには、既定で必要なものがすべて含まれています。たとえば、ウィザードを使用して MFC をサポートする Win32 コンソール アプリケーションを作成すると、メモリ リークの追跡が機能します。new DEBUG_NEWプロジェクトに追加されたすべての新しいファイルに再定義を追加するだけです。

于 2013-12-30T13:20:08.337 に答える