診断サービスDiagnostic Services

Microsoft Foundation Class ライブラりは、プログラムのデバッグをより簡単にする多くの診断サービスを提供します。The Microsoft Foundation Class Library supplies many diagnostic services that make debugging your programs easier. これらの診断サービスには、プログラムのメモリー割り当てを追跡したり、実行時にオブジェクトの内容をダンプしたり、実行時にデバッグ メッセージを表示したりできるようにするマクロやグローバル関数が含まれます。These diagnostic services include macros and global functions that allow you to track your program's memory allocations, dump the contents of objects during run time, and print debugging messages during run time. 診断サービスのマクロとグローバル関数は、次のカテゴリに分類されます。The macros and global functions for diagnostic services are grouped into the following categories:

  • 汎用診断マクロGeneral diagnostic macros

  • 汎用診断関数と変数General diagnostic functions and variables

  • オブジェクト診断関数Object diagnostic functions

これらのマクロと関数は、MFC のデバッグ バージョンとリリース バージョンの CObject から派生するすべてのクラスで使用できます。These macros and functions are available for all classes derived from CObject in the Debug and Release versions of MFC. ただし、DEBUG_NEW と検証を除くすべてのバージョンでは、リリースバージョンでは何も実行されません。However, all except DEBUG_NEW and VERIFY do nothing in the Release version.

デバッグ ライブラリ内の割り当てられるすべてのメモリ ブロックは、一連の "ガード バイト" で囲まれます。In the Debug library, all allocated memory blocks are bracketed with a series of "guard bytes." これらのバイトが間違ったメモリ書き込みによって乱される場合、診断ルーチンが問題を報告できます。If these bytes are disturbed by an errant memory write, then the diagnostic routines can report a problem. 行:If you include the line:

#define new DEBUG_NEW

実装ファイルでは、のすべての呼び出しに、 new メモリの割り当てが行われたときのファイル名と行番号が格納されます。in your implementation file, all calls to new will store the filename and line number where the memory allocation took place. 関数 CMemoryState::D umpallobjectssince は、この追加情報を表示し、メモリリークを識別できるようにします。The function CMemoryState::DumpAllObjectsSince will display this extra information, allowing you to identify memory leaks. 診断出力の追加情報については、クラス CDumpContext も参照してください。Refer also to the class CDumpContext for additional information on diagnostic output.

さらに、C ランタイム ライブラリは、アプリケーションのデバッグに使用できる診断関数のセットもサポートしています。In addition, the C run-time library also supports a set of diagnostic functions you can use to debug your applications. 詳細については、「Run-Time ライブラリリファレンス」の「 デバッグルーチン 」を参照してください。For more information, see Debug Routines in the Run-Time Library Reference.

MFC 汎用診断マクロMFC General Diagnostic Macros

名前Name 説明Description
アサートASSERT ライブラリのデバッグ バージョンで、指定された式が FALSE に評価された場合、メッセージを出力し、プログラムを中止します。Prints a message and then aborts the program if the specified expression evaluates to FALSE in the Debug version of the library.
ASSERT_KINDOFASSERT_KINDOF オブジェクトが、指定されたクラスのオブジェクト、または指定されたクラスから派生したクラスのオブジェクトであることをテストします。Tests that an object is an object of the specified class or of a class derived from the specified class.
ASSERT_VALIDASSERT_VALID その AssertValid メンバー関数 (通常は CObjectからオーバーライドされる) を呼び出すことにより、オブジェクトの内部の有効性をテストします。Tests the internal validity of an object by calling its AssertValid member function; typically overridden from CObject.
DEBUG_NEWDEBUG_NEW デバッグ モードのすべてのオブジェクト割り当てにファイル名と行番号を指定します。これは、メモリー リークを見つけるのに役立ちます。Supplies a filename and line number for all object allocations in Debug mode to help find memory leaks.
DEBUG_ONLYDEBUG_ONLY ASSERT に類似していますが、式の値のテストは行いません。デバッグ モードでのみ実行されるコードで役立ちます。Similar to ASSERT but does not test the value of the expression; useful for code that should execute only in Debug mode.
と ENSURE_VALID を確認するENSURE and ENSURE_VALID データの正確性を検証するために使用します。Use to validate data correctness.
THIS_FILETHIS_FILE は、コンパイルするファイルの名前に展開されます。Expands to the name of the file that is being compiled.
TRACETRACE ライブラリのデバッグ バージョンで printfに類似した機能を提供します。Provides printf-like capability in the Debug version of the library.
VERIFY ASSERT と類似していますが、ライブラリのリリース バージョンとデバッグ バージョンで式を評価します。Similar to ASSERT but evaluates the expression in the Release version of the library as well as in the Debug version.

MFC 汎用診断関数と変数MFC General Diagnostic Variables and Functions

名前Name 説明Description
afxDumpafxDump デバッガーの出力ウィンドウまたはデバッグ端末に CDumpContext 情報を送信するグローバル変数。Global variable that sends CDumpContext information to the debugger output window or to the debug terminal.
afxMemDFafxMemDF デバッグ メモリ アロケーターの動作を制御するグローバル変数。Global variable that controls the behavior of the debugging memory allocator.
AfxCheckErrorAfxCheckError エラーかどうかを確認するため、そしてもしエラーであれば、適切なエラーをスローするために、渡される SCODE のテストに使用するグローバル変数。Global variable used to test the passed SCODE to see if it is an error and, if so, throws the appropriate error.
AfxCheckMemoryAfxCheckMemory 現在割り当てられているすべてのメモリの整合性を確認します。Checks the integrity of all currently allocated memory.
AfxDebugBreakAfxDebugBreak 実行の中断を発生させます。Causes a break in execution.
afxDumpAfxDump デバッガーにある間に呼び出さると、デバッグ中にオブジェクトの状態をダンプします。If called while in the debugger, dumps the state of an object while debugging.
afxDumpAfxDump デバッグ中にオブジェクトの状態をダンプする内部関数。Internal function that dumps the state of an object while debugging.
AfxDumpStackAfxDumpStack 現在のスタックのイメージを生成します。Generate an image of the current stack. この関数は、常に、静的にリンクされます。This function is always linked statically.
AfxEnableMemoryLeakDumpAfxEnableMemoryLeakDump メモリ リーク ダンプを有効にします。Enables the memory leak dump.
AfxEnableMemoryTrackingAfxEnableMemoryTracking メモリのトラッキングをオンまたはオフにします。Turns memory tracking on and off.
AfxIsMemoryBlockAfxIsMemoryBlock メモリ ブロックが正しく割り当てられていることを確認します。Verifies that a memory block has been properly allocated.
AfxIsValidAddressAfxIsValidAddress メモリ アドレスの範囲がプログラムの境界内にあることを確認します。Verifies that a memory address range is within the program's bounds.
AfxIsValidStringAfxIsValidString 文字列へのポインターが有効かどうかを判断します。Determines whether a pointer to a string is valid.
AfxSetAllocHookAfxSetAllocHook 各メモリ割り振りでの関数の呼び出しを有効にします。Enables the calling of a function on each memory allocation.

MFC オブジェクト診断関数MFC Object Diagnostic Functions

名前Name 説明Description
AfxDoForAllClassesAfxDoForAllClasses ランタイム型チェックをサポートする CObjectから派生したすべてのクラスで、指定された関数を実行します。Performs a specified function on all CObject-derived classes that support run-time type checking.
AfxDoForAllObjectsAfxDoForAllObjects で割り当てられたすべてのから派生したオブジェクトに対して、指定された関数を実行 CObject new します。Performs a specified function on all CObject-derived objects that were allocated with new.

MFC コンパイルマクロMFC Compilation Macros

名前Name 説明Description
_AFX_SECURE_NO_WARNINGS_AFX_SECURE_NO_WARNINGS 非推奨の MFC 関数の使用について、コンパイラの警告を表示しません。Suppresses compiler warnings for the use of deprecated MFC functions.

_AFX_SECURE_NO_WARNINGS_AFX_SECURE_NO_WARNINGS

非推奨の MFC 関数の使用について、コンパイラの警告を表示しません。Suppresses compiler warnings for the use of deprecated MFC functions.

構文Syntax

_AFX_SECURE_NO_WARNINGS

Example

このコードサンプルでは、_AFX_SECURE_NO_WARNINGS が定義されていない場合、コンパイラの警告が発生します。This code sample would cause a compiler warning if _AFX_SECURE_NO_WARNINGS were not defined.

// define this before including any afx files in *pch.h* (*stdafx.h* in Visual Studio 2017 and earlier)
#define _AFX_SECURE_NO_WARNINGS
CRichEditCtrl* pRichEdit = new CRichEditCtrl;
pRichEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE,
   CRect(10,10,100,200), pParentWnd, 1);
char sz[256];
pRichEdit->GetSelText(sz);

AfxDebugBreakAfxDebugBreak

この関数を呼び出すと、 AfxDebugBreak MFC アプリケーションのデバッグバージョンの実行中に、(への呼び出しの位置で) 中断が発生します。Call this function to cause a break (at the location of the call to AfxDebugBreak) in the execution of the debug version of your MFC application.

構文Syntax

void AfxDebugBreak( );

解説Remarks

AfxDebugBreak MFC アプリケーションのリリースバージョンには影響しないため、削除する必要があります。AfxDebugBreak has no effect in release versions of an MFC application and should be removed. この関数は、MFC アプリケーションでのみ使用してください。This function should only be used in MFC applications. Win32 API バージョンのを使用して、 DebugBreak 非 MFC アプリケーションで中断を発生させます。Use the Win32 API version, DebugBreak, to cause a break in non-MFC applications.

要件Requirements

ヘッダー: afxver_Header: afxver_.h

アサートASSERT

引数を評価します。Evaluates its argument.

ASSERT(booleanExpression)

パラメーターParameters

booleanExpressionbooleanExpression
0以外または0に評価される式 (ポインター値を含む) を指定します。Specifies an expression (including pointer values) that evaluates to nonzero or 0.

解説Remarks

結果が0の場合、マクロは診断メッセージを出力し、プログラムを中止します。If the result is 0, the macro prints a diagnostic message and aborts the program. 条件が0以外の場合は、何も実行されません。If the condition is nonzero, it does nothing.

診断メッセージにフォームがありますThe diagnostic message has the form

assertion failed in file <name> in line <num>

ここで、 name はソースファイルの名前、 num はソースファイルで失敗したアサーションの行番号です。where name is the name of the source file, and num is the line number of the assertion that failed in the source file.

MFC のリリースバージョンでは、ASSERT は式を評価しないため、プログラムは中断されません。In the Release version of MFC, ASSERT does not evaluate the expression and thus will not interrupt the program. 環境に関係なく式を評価する必要がある場合は、ASSERT の代わりに VERIFY マクロを使用します。If the expression must be evaluated regardless of environment, use the VERIFY macro in place of ASSERT.

注意

この関数は、MFC のデバッグバージョンでのみ使用できます。This function is available only in the Debug version of MFC.

Example

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(pcage != NULL);
ASSERT(pcage->IsKindOf(RUNTIME_CLASS(CAge)));
// Terminates program only if pcage is NOT a CAge*.   

要件Requirements

ヘッダー: afxHeader: afx.h

ASSERT_KINDOFASSERT_KINDOF

このマクロは、ポインターが指すオブジェクトが、指定されたクラスのオブジェクトであるか、または指定されたクラスから派生したクラスのオブジェクトであることをアサートします。This macro asserts that the object pointed to is an object of the specified class, or is an object of a class derived from the specified class.

ASSERT_KINDOF(classname, pobject)

パラメーターParameters

classnameclassname
派生クラスの名前 CObjectThe name of a CObject-derived class.

pobjectpobject
クラスオブジェクトへのポインター。A pointer to a class object.

解説Remarks

Pobject パラメーターは、オブジェクトへのポインターである必要があり、にすることができ const ます。The pobject parameter should be a pointer to an object and can be const. が指すオブジェクトとクラスは、ランタイムクラス情報をサポートする必要があり CObject ます。The object pointed to and the class must support CObject run-time class information. たとえば、 pDocumentCMyDoc クラスまたはその派生クラスのオブジェクトへのポインターであることを確認するには、次のコードを記述します。As an example, to ensure that pDocument is a pointer to an object of the CMyDoc class, or any of its derivatives, you could code:

ASSERT_KINDOF(CMyDoc, pDocument);

マクロの使用 ASSERT_KINDOF は、コーディングとまったく同じです。Using the ASSERT_KINDOF macro is exactly the same as coding:

ASSERT(pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));

この関数は、[DECLARE_DYNAMIC] (実行時-declare_dynamic または DECLARE_SERIAL マクロで宣言されたクラスに対してのみ機能します。This function works only for classes declared with the [DECLARE_DYNAMIC](run-time-object-model-services.md#declare_dynamic or DECLARE_SERIAL macro.

注意

この関数は、MFC のデバッグバージョンでのみ使用できます。This function is available only in the Debug version of MFC.

要件Requirements

ヘッダー: afxHeader: afx.h

ASSERT_VALIDASSERT_VALID

オブジェクトの内部状態の有効性について想定をテストするには、を使用します。Use to test your assumptions about the validity of an object's internal state.

ASSERT_VALID(pObject)

パラメーターParameters

pObjectpObject
CObjectメンバー関数のオーバーライドバージョンを持つから派生したクラスのオブジェクトを指定し AssertValid ます。Specifies an object of a class derived from CObject that has an overriding version of the AssertValid member function.

解説Remarks

ASSERT_VALID は、 AssertValid 引数として渡されたオブジェクトのメンバー関数を呼び出します。ASSERT_VALID calls the AssertValid member function of the object passed as its argument.

MFC のリリースバージョンでは、ASSERT_VALID は何も行いません。In the Release version of MFC, ASSERT_VALID does nothing. デバッグバージョンでは、ポインターが検証され、NULL がチェックされ、オブジェクト自体の AssertValid メンバー関数が呼び出されます。In the Debug version, it validates the pointer, checks against NULL, and calls the object's own AssertValid member functions. これらのテストのいずれかが失敗した場合は、 アサートと同じ方法で警告メッセージが表示されます。If any of these tests fails, an alert message is displayed in the same manner as ASSERT.

注意

この関数は、MFC のデバッグバージョンでのみ使用できます。This function is available only in the Debug version of MFC.

詳細と例については、「 MFC アプリケーションのデバッグ」を参照してください。For more information and examples, see Debugging MFC Applications.

Example

// Assure that pMyObject is a valid pointer to an
// object derived from CObject.
ASSERT_VALID(pMyObject);

要件Requirements

ヘッダー: afxHeader: afx.h

DEBUG_NEWDEBUG_NEW

メモリリークの検出を支援します。Assists in finding memory leaks.

#define  new DEBUG_NEW

解説Remarks

プログラム内のすべての場所で DEBUG_NEW を使用すると、通常は演算子を使用して new ヒープストレージを割り当てることができます。You can use DEBUG_NEW everywhere in your program that you would ordinarily use the new operator to allocate heap storage.

デバッグモード ( _DEBUG シンボルが定義されている場合) では、DEBUG_NEW は、割り当てられた各オブジェクトのファイル名と行番号を追跡します。In debug mode (when the _DEBUG symbol is defined), DEBUG_NEW keeps track of the filename and line number for each object that it allocates. 次に、 CMemoryState::D umpallobjectssince メンバー関数を使用すると、DEBUG_NEW で割り当てられた各オブジェクトが、割り当てられたファイル名と行番号と共に表示されます。Then, when you use the CMemoryState::DumpAllObjectsSince member function, each object allocated with DEBUG_NEW is shown with the filename and line number where it was allocated.

DEBUG_NEW を使用するには、ソースファイルに次のディレクティブを挿入します。To use DEBUG_NEW, insert the following directive into your source files:

#define new DEBUG_NEW

このディレクティブを挿入すると、プリプロセッサによって DEBUG_NEW が挿入され new ます。Once you insert this directive, the preprocessor will insert DEBUG_NEW wherever you use new, and MFC does the rest. プログラムのリリースバージョンをコンパイルすると、DEBUG_NEW は単純な操作に解決され、 new ファイル名と行番号の情報は生成されません。When you compile a release version of your program, DEBUG_NEW resolves to a simple new operation, and the filename and line number information are not generated.

注意

以前のバージョンの MFC (4.1 およびそれ以前) で #define は、IMPLEMENT_DYNCREATE または IMPLEMENT_SERIAL マクロを呼び出したすべてのステートメントの後にステートメントを配置する必要がありました。In previous versions of MFC (4.1 and earlier) you needed to put the #define statement after all statements that called the IMPLEMENT_DYNCREATE or IMPLEMENT_SERIAL macros. これはもう不要です。This is no longer necessary.

要件Requirements

ヘッダー: afxHeader: afx.h

DEBUG_ONLYDEBUG_ONLY

デバッグモード ( _DEBUG シンボルが定義されている場合) では、DEBUG_ONLY はその引数を評価します。In debug mode (when the _DEBUG symbol is defined), DEBUG_ONLY evaluates its argument.

DEBUG_ONLY(expression)

解説Remarks

リリースビルドでは、DEBUG_ONLY はその引数を評価しません。In a release build, DEBUG_ONLY does not evaluate its argument. これは、デバッグビルドでのみ実行する必要があるコードがある場合に便利です。This is useful when you have code that should be executed only in debug builds.

DEBUG_ONLY マクロは、and で囲んでいる と同じです #ifdef _DEBUG #endifThe DEBUG_ONLY macro is equivalent to surrounding expression with #ifdef _DEBUG and #endif.

Example

void ExampleFunc(char* p, int size, char fill)
{
   char* q;               // working copy of pointer 
   VERIFY(q = p);         // copy buffer pointer and validate
   ASSERT(size >= 100);   // make sure buffer is at least 100 bytes
   ASSERT(isalpha(fill)); // make sure fill character is alphabetic
   // if fill character is invalid, substitute 'X' so we can continue
   // debugging after the preceding ASSERT fails.
   DEBUG_ONLY(fill = (isalpha(fill)) ? fill : 'X');
}

要件Requirements

ヘッダー: afxHeader: afx.h

と ENSURE_VALID を確認するENSURE and ENSURE_VALID

データの正確性を検証するために使用します。Use to validate data correctness.

構文Syntax

ENSURE(  booleanExpression )
ENSURE_VALID( booleanExpression  )

パラメーターParameters

booleanExpressionbooleanExpression
テストするブール式を指定します。Specifies a boolean expression to be tested.

解説Remarks

これらのマクロの目的は、パラメーターの検証を強化することです。The purpose of these macros is to improve the validation of parameters. マクロを使用すると、コード内の不適切なパラメーターをさらに処理できなくなります。The macros prevent further processing of incorrect parameters in your code. ASSERT マクロとは異なり、マクロはアサーションの生成に加えて例外をスローします。Unlike the ASSERT macros, the ENSURE macros throw an exception in addition to generating an assertion.

マクロは、プロジェクトの構成に従って2つの方法で動作します。The macros behave in two ways, according to the project configuration. マクロは ASSERT を呼び出し、アサーションが失敗した場合は例外をスローします。The macros call ASSERT and then throw an exception if the assertion fails. したがって、デバッグ構成 (_DEBUG が定義されている場合) では、リリース構成でマクロがアサーションと例外を生成するのに対し、マクロは例外のみを生成します (ASSERT はリリース構成の式を評価しません)。Thus, in Debug configurations (that is, where _DEBUG is defined) the macros produce an assertion and exception while in Release configurations, the macros produce only the exception (ASSERT does not evaluate the expression in Release configurations).

マクロ ENSURE_ARG は、確実にマクロとして機能します。The macro ENSURE_ARG acts like the ENSURE macro.

ENSURE_VALID は ASSERT_VALID マクロ (デバッグビルドでのみ効果がある) を呼び出します。ENSURE_VALID calls the ASSERT_VALID macro (which has an effect only in Debug builds). また、ポインターが NULL の場合、ENSURE_VALID は例外をスローします。In addition, ENSURE_VALID throws an exception if the pointer is NULL. NULL テストは、デバッグ構成とリリース構成の両方で実行されます。The NULL test is performed in both Debug and Release configurations.

これらのテストのいずれかが失敗した場合は、アサートと同じ方法で警告メッセージが表示されます。If any of these tests fails, an alert message is displayed in the same manner as ASSERT. マクロは、必要に応じて無効な引数の例外をスローします。The macro throws an invalid argument exception if needed.

要件Requirements

ヘッダー: afxHeader: afx.h

THIS_FILETHIS_FILE

は、コンパイルするファイルの名前に展開されます。Expands to the name of the file that is being compiled.

構文Syntax

THIS_FILE

解説Remarks

この情報は、ASSERT マクロと VERIFY マクロによって使用されます。The information is used by the ASSERT and VERIFY macros. アプリケーションウィザードとコードウィザードでは、作成したソースコードファイルにマクロが配置されます。The Application Wizard and code wizards place the macro in source code files they create.

Example

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// __FILE__ is one of the six predefined ANSI C macros that the
// compiler recognizes.

要件Requirements

ヘッダー: afxHeader: afx.h

トレースTRACE

指定された文字列を現在のアプリケーションのデバッガーに送信します。Sends the specified string to the debugger of the current application.

TRACE(exp)
TRACE(DWORD  category,  UINT  level, LPCSTR lpszFormat, ...)

解説Remarks

トレースの詳細については、「 ATLTRACE2 」を参照してください。See ATLTRACE2 for a description of TRACE. TRACE と ATLTRACE2 の動作は同じです。TRACE and ATLTRACE2 have the same behavior.

MFC のデバッグバージョンでは、このマクロは、指定された文字列を現在のアプリケーションのデバッガーに送信します。In the debug version of MFC, this macro sends the specified string to the debugger of the current application. リリースビルドでは、このマクロは何もコンパイルされません (コードがまったく生成されることはありません)。In a release build, this macro compiles to nothing (no code is generated at all).

詳細については、「 MFC アプリケーションのデバッグ」を参照してください。For more information, see Debugging MFC Applications.

要件Requirements

ヘッダー: afxHeader: afx.h

VERIFY

MFC のデバッグバージョンでは、はその引数を評価します。In the Debug version of MFC, evaluates its argument.

VERIFY(booleanExpression)

パラメーターParameters

booleanExpressionbooleanExpression
0以外または0に評価される式 (ポインター値を含む) を指定します。Specifies an expression (including pointer values) that evaluates to nonzero or 0.

解説Remarks

結果が0の場合、マクロは診断メッセージを出力し、プログラムを停止します。If the result is 0, the macro prints a diagnostic message and halts the program. 条件が0以外の場合は、何も実行されません。If the condition is nonzero, it does nothing.

診断メッセージにフォームがありますThe diagnostic message has the form

assertion failed in file <name> in line <num>

ここで、 name はソースファイルの名前、 num はソースファイルで失敗したアサーションの行番号です。where name is the name of the source file and num is the line number of the assertion that failed in the source file.

MFC のリリースバージョンでは、VERIFY は式を評価しますが、プログラムを印刷または中断しません。In the Release version of MFC, VERIFY evaluates the expression but does not print or interrupt the program. たとえば、式が関数呼び出しの場合は、呼び出しが行われます。For example, if the expression is a function call, the call will be made.

Example

// VERIFY can be used for things that should never fail, though
// you may want to make sure you can provide better error recovery
// if the error can actually cause a crash in a production system.

// It _is_ possible that GetDC() may fail, but the out-of-memory
// condition that causes it isn't likely. For a test application,
// this use of VERIFY() is fine. For any production code, this
// usage is dubious.

// get the display device context
HDC hdc;
VERIFY((hdc = ::GetDC(hwnd)) != NULL);

// give the display context back
::ReleaseDC(hwnd, hdc);

要件Requirements

ヘッダー: afxHeader: afx.h

afxDump (MFC の CDumpContext)afxDump (CDumpContext in MFC)

アプリケーションで基本的なオブジェクトダンプ機能を提供します。Provides basic object-dumping capability in your application.

CDumpContext  afxDump;

解説Remarks

afxDumpは、デバッガー CDumpContext 出力ウィンドウまたはデバッグターミナルに情報を送信できる定義済みの CDumpContext オブジェクトです。afxDump is a predefined CDumpContext object that allows you to send CDumpContext information to the debugger output window or to a debug terminal. 通常は、の afxDump パラメーターとしてを指定し CObject::Dump ます。Typically, you supply afxDump as a parameter to CObject::Dump.

Windows NT とすべてのバージョンの Windows で afxDump は、アプリケーションをデバッグするときに Visual C++ の [Output-Debug] ウィンドウに出力が送信されます。Under Windows NT and all versions of Windows, afxDump output is sent to the Output-Debug window of Visual C++ when you debug your application.

この変数は、MFC のデバッグバージョンでのみ定義されています。This variable is defined only in the Debug version of MFC. の詳細につい afxDump ては、「 MFC アプリケーションのデバッグ」を参照してください。For more information on afxDump, see Debugging MFC Applications.

Example

// example for afxDump
CPerson* pMyPerson = new CPerson;
// set some fields of the CPerson object...
//..
// now dump the contents
#ifdef _DEBUG
afxDump << _T("Dumping myPerson:\n");
pMyPerson->Dump(afxDump);
afxDump << _T("\n");
#endif

要件Requirements

ヘッダー: afxHeader: afx.h

AfxDump (内部)AfxDump (Internal)

デバッグ中にオブジェクトの状態をダンプするために MFC で使用される内部関数です。Internal function that MFC uses to dump the state of an object while debugging.

構文Syntax

void AfxDump(const CObject* pOb);

パラメーターParameters

pObpOb
から派生したクラスのオブジェクトへのポインター CObjectA pointer to an object of a class derived from CObject.

解説Remarks

AfxDump オブジェクトのメンバー関数を呼び出し、 Dump 変数によって指定された場所に情報を送信し afxDump ます。AfxDump calls an object's Dump member function and sends the information to the location specified by the afxDump variable. AfxDump は、MFC のデバッグバージョンでのみ使用できます。AfxDump is available only in the Debug version of MFC.

プログラムのコードではを呼び出さないでください AfxDump 。代わりに、 Dump 適切なオブジェクトのメンバー関数を呼び出す必要があります。Your program code should not call AfxDump, but should instead call the Dump member function of the appropriate object.

要件Requirements

ヘッダー: afxHeader: afx.h

afxMemDFafxMemDF

この変数は、デバッガーまたはプログラムからアクセスでき、割り当ての診断を調整できます。This variable is accessible from a debugger or your program and allows you to tune allocation diagnostics.

int  afxMemDF;

解説Remarks

afxMemDF には、列挙体で指定されているように、次の値を指定でき afxMemDF ます。afxMemDF can have the following values as specified by the enumeration afxMemDF:

  • allocMemDF デバッグアロケーター (デバッグライブラリの既定の設定) を有効にします。allocMemDF Turns on debugging allocator (default setting in Debug library).

  • delayFreeMemDF メモリの解放を遅らせます。delayFreeMemDF Delays freeing memory. プログラムはメモリブロックを解放しますが、アロケーターはそのメモリを基になるオペレーティングシステムに返しません。While your program frees a memory block, the allocator does not return that memory to the underlying operating system. これにより、プログラムの最大メモリ負荷が発生します。This will place maximum memory stress on your program.

  • checkAlwaysMemDF``AfxCheckMemoryメモリが割り当てられるか解放されるたびに、を呼び出します。checkAlwaysMemDF Calls AfxCheckMemory every time memory is allocated or freed. これにより、メモリの割り当てと割り当て解除が大幅に遅くなります。This will significantly slow memory allocations and deallocations.

Example

afxMemDF = allocMemDF | checkAlwaysMemDF;

要件Requirements

ヘッダー: afxHeader: afx.h

AfxCheckErrorAfxCheckError

この関数は、渡された SCODE をテストして、エラーであるかどうかを確認します。This function tests the passed SCODE to see if it is an error.

void AFXAPI AfxCheckError(SCODE sc);
throw CMemoryException*
throw COleException*

解説Remarks

エラーの場合、関数は例外をスローします。If it is an error, the function throws an exception. 渡された SCODE が E_OUTOFMEMORY 場合、関数はAfxThrowMemoryExceptionを呼び出してCMemoryExceptionをスローします。If the passed SCODE is E_OUTOFMEMORY, the function throws a CMemoryException by calling AfxThrowMemoryException. それ以外の場合、関数はAfxThrowOleExceptionを呼び出すことによってCOleExceptionをスローします。Otherwise, the function throws a COleException by calling AfxThrowOleException.

この関数を使用すると、アプリケーション内の OLE 関数に対する呼び出しの戻り値を確認できます。This function can be used to check the return values of calls to OLE functions in your application. アプリケーションでこの関数を使用して戻り値をテストすることで、最小限のコードでエラー状態に適切に対応できます。By testing the return value with this function in your application, you can properly react to error conditions with a minimal amount of code.

注意

この関数は、デバッグビルドと非デバッグビルドで同じ効果を持ちます。This function has the same effect in debug and non-debug builds.

Example

AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_INPROC_SERVER,
   IID_IDispatch, (LPVOID*)& pWMPDispatch));

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

要件Requirements

ヘッダー: afxHeader: afx.h

AfxCheckMemoryAfxCheckMemory

この関数は、空きメモリプールを検証し、必要に応じてエラーメッセージを出力します。This function validates the free memory pool and prints error messages as required.

BOOL  AfxCheckMemory();

戻り値Return Value

メモリエラーがない場合は0以外。それ以外の場合は0です。Nonzero if no memory errors; otherwise 0.

解説Remarks

関数がメモリの破損を検出しなかった場合は、何も出力しません。If the function detects no memory corruption, it prints nothing.

現在ヒープに割り当てられているすべてのメモリブロックがチェックされます。これには、 new malloc 関数や Windows 関数など、基になるメモリアロケーターの直接呼び出しで割り当てられたメモリブロックは含まれません GlobalAllocAll memory blocks currently allocated on the heap are checked, including those allocated by new but not those allocated by direct calls to underlying memory allocators, such as the malloc function or the GlobalAlloc Windows function. 破損しているブロックが見つかった場合は、デバッガーの出力にメッセージが出力されます。If any block is found to be corrupted, a message is printed to the debugger output.

行を含める場合If you include the line

#define new DEBUG_NEW

プログラムモジュールでは、後続のを呼び出す AfxCheckMemory と、メモリが割り当てられたファイル名と行番号が表示されます。in a program module, then subsequent calls to AfxCheckMemory show the filename and line number where the memory was allocated.

注意

モジュールにシリアル化可能なクラスの1つ以上の実装が含まれている場合は、 #define 最後の IMPLEMENT_SERIAL マクロ呼び出しの後に行を配置する必要があります。If your module contains one or more implementations of serializable classes, then you must put the #define line after the last IMPLEMENT_SERIAL macro call.

この関数は、MFC のデバッグバージョンでのみ動作します。This function works only in the Debug version of MFC.

Example

CAge* pcage = new CAge(21);  // CAge is derived from CObject.
Age* page = new Age(22);     // Age is NOT derived from CObject.
*(((char*)pcage) - 1) = 99;   // Corrupt preceding guard byte
*(((char*)page) - 1) = 99;    // Corrupt preceding guard byte
AfxCheckMemory();

要件Requirements

ヘッダー: afxHeader: afx.h

AfxDump (MFC)AfxDump (MFC)

デバッガーでこの関数を呼び出して、デバッグ中にオブジェクトの状態をダンプします。Call this function while in the debugger to dump the state of an object while debugging.

void AfxDump(const CObject* pOb);

パラメーターParameters

pObpOb
から派生したクラスのオブジェクトへのポインター CObjectA pointer to an object of a class derived from CObject.

解説Remarks

AfxDump オブジェクトのメンバー関数を呼び出し、 Dump 変数によって指定された場所に情報を送信し afxDump ます。AfxDump calls an object's Dump member function and sends the information to the location specified by the afxDump variable. AfxDump は、MFC のデバッグバージョンでのみ使用できます。AfxDump is available only in the Debug version of MFC.

プログラムのコードではを呼び出さないでください AfxDump 。代わりに、 Dump 適切なオブジェクトのメンバー関数を呼び出す必要があります。Your program code should not call AfxDump, but should instead call the Dump member function of the appropriate object.

要件Requirements

ヘッダー: afxHeader: afx.h

AfxDumpStackAfxDumpStack

このグローバル関数を使用すると、現在のスタックのイメージを生成できます。This global function can be used to generate an image of the current stack.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

パラメーターParameters

dwTargetdwTarget
ダンプ出力の対象を示します。Indicates the target of the dump output. 使用できる値は、ビットごとの OR ( |) 演算子を使用して組み合わせることができます。次に例を示します。Possible values, which can be combined using the bitwise-OR ( |) operator, are as follows:

  • AFX_STACK_DUMP_TARGET_TRACE は、 TRACE マクロを使って出力を送信します。AFX_STACK_DUMP_TARGET_TRACE Sends output by means of the TRACE macro. トレースマクロは、デバッグビルドでのみ出力を生成します。リリースビルドでは、出力は生成されません。The TRACE macro generates output in debug builds only; it generates no output in release builds. また、トレースは、デバッガー以外の他のターゲットにリダイレクトすることもできます。Also, TRACE can be redirected to other targets besides the debugger.

  • AFX_STACK_DUMP_TARGET_DEFAULT は、ダンプ出力を既定のターゲットに送信します。AFX_STACK_DUMP_TARGET_DEFAULT Sends dump output to the default target. デバッグビルドの場合、出力はトレースマクロに送られます。For a debug build, output goes to the TRACE macro. リリースビルドでは、出力はクリップボードに移動します。In a release build, output goes to the Clipboard.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD は、出力をクリップボードにのみ送信します。AFX_STACK_DUMP_TARGET_CLIPBOARD Sends output to the Clipboard only. データはクリップボードに CF_TEXT クリップボード形式を使用してプレーンテキストとして配置されます。The data is placed on the Clipboard as plain text using the CF_TEXT Clipboard format.

  • AFX_STACK_DUMP_TARGET_BOTH は、出力をクリップボードとトレースマクロに同時に送信します。AFX_STACK_DUMP_TARGET_BOTH Sends output to the Clipboard and to the TRACE macro, simultaneously.

  • AFX_STACK_DUMP_TARGET_ODS は、Win32 関数を使って直接デバッガーに出力を送信し OutputDebugString() ます。AFX_STACK_DUMP_TARGET_ODS Sends output directly to the debugger by means of the Win32 function OutputDebugString(). このオプションを選択すると、デバッガーがプロセスにアタッチされたときにデバッグビルドとリリースビルドの両方でデバッガー出力が生成されます。This option will generate debugger output in both debug and release builds when a debugger is attached to the process. AFX_STACK_DUMP_TARGET_ODS は常にデバッガーに到達し (アタッチされている場合)、リダイレクトできません。AFX_STACK_DUMP_TARGET_ODS always reaches the debugger (if it is attached) and cannot be redirected.

解説Remarks

次の例は、 AfxDumpStack MFC ダイアログアプリケーションのボタンハンドラーからを呼び出すことによって生成される1行の出力を反映しています。The example below reflects a single line of the output generated from calling AfxDumpStack from a button handler in an MFC dialog application:

=== begin AfxDumpStack output ===
00427D55: DUMP2\DEBUG\DUMP2.EXE! void AfxDumpStack(unsigned long) + 181 bytes
0040160B: DUMP2\DEBUG\DUMP2.EXE! void CDump2Dlg::OnClipboard(void) + 14 bytes
0044F884: DUMP2\DEBUG\DUMP2.EXE! int _AfxDispatchCmdMsg(class CCmdTarget *,
unsigned int,int,void ( CCmdTarget::*)(void),void *,unsigned int,struct
AFX_CMDHANDLE
0044FF7B: DUMP2\DEBUG\DUMP2.EXE! virtual int CCmdTarget::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 626 bytes
00450C71: DUMP2\DEBUG\DUMP2.EXE! virtual int CDialog::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 36 bytes
00455B27: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnCommand(unsigned
int,long) + 312 bytes
00454D3D: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnWndMsg(unsigned
int,unsigned int,long,long *) + 83 bytes
00454CC0: DUMP2\DEBUG\DUMP2.EXE! virtual long CWnd::WindowProc(unsigned
int,unsigned int,long) + 46 bytes
004528D9: DUMP2\DEBUG\DUMP2.EXE! long AfxCallWndProc(class CWnd *,struct
HWND__ *,unsigned int,unsigned int,long) + 237 bytes
00452D34: DUMP2\DEBUG\DUMP2.EXE! long AfxWndProc(struct HWND__ *,unsigned
int,unsigned int,long) + 129 bytes
BFF73663: WINDOWS\SYSTEM\KERNEL32.DLL! ThunkConnect32 + 2148 bytes
BFF928E0: WINDOWS\SYSTEM\KERNEL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===

上記の出力の各行には、最後の関数呼び出しのアドレス、関数呼び出しを含むモジュールの完全なパス名、およびという関数プロトタイプが示されています。Each line in the output above indicates the address of the last function call, the full path name of the module that contains the function call, and the function prototype called. 関数の正確なアドレスでスタックに対する関数呼び出しが行われない場合は、バイトのオフセットが表示されます。If the function call on the stack does not happen at the exact address of the function, an offset of bytes is shown.

たとえば、次の表は、上記の出力の最初の行を示しています。For example, the following table describes the first line of the above output:

出力Output 説明Description
00427D55: 最後の関数呼び出しの戻り先アドレス。The return address of the last function call.
DUMP2\DEBUG\DUMP2.EXE! 関数呼び出しを含むモジュールの完全なパス名。The full path name of the module that contains the function call.
void AfxDumpStack(unsigned long) 関数プロトタイプが呼び出されました。The function prototype called.
+ 181 bytes 関数プロトタイプ (この場合は) のアドレスから void AfxDumpStack(unsigned long) 戻り先アドレス (この場合は) までのオフセット (バイト単位) 00427D55The offset in bytes from the address of the function prototype (in this case, void AfxDumpStack(unsigned long)) to the return address (in this case, 00427D55).

AfxDumpStack は、MFC ライブラリの debug および nondebug バージョンで使用できます。ただし、この関数は、実行可能ファイルが共有 DLL で MFC を使用している場合でも、常に静的にリンクされます。AfxDumpStack is available in debug and nondebug versions of the MFC libraries; however, the function is always linked statically, even when your executable file uses MFC in a shared DLL. 共有ライブラリの実装では、関数は MFCS42 にあります。LIB ライブラリ (およびそのバリエーション)。In shared-library implementations, the function is found in the MFCS42.LIB library (and its variants).

この関数を正常に使用するには:To use this function successfully:

  • ファイル IMAGEHLP.DLL はパス上にある必要があります。The file IMAGEHLP.DLL must be on your path. この DLL がない場合は、関数によってエラーメッセージが表示されます。If you do not have this DLL, the function will display an error message. IMAGEHLP.DLL によって提供される関数セットの詳細については、「 イメージヘルプライブラリ 」を参照してください。See Image Help Library for information on the function set provided by IMAGEHLP.

  • スタック上のフレームを持つモジュールには、デバッグ情報が含まれている必要があります。The modules that have frames on the stack must include debugging information. デバッグ情報が含まれていない場合でも、関数はスタックトレースを生成しますが、トレースの詳細は低くなります。If they do not contain debugging information, the function will still generate a stack trace, but the trace will be less detailed.

要件Requirements

ヘッダー: afxHeader: afx.h

AfxEnableMemoryLeakDumpAfxEnableMemoryLeakDump

AFX_DEBUG_STATE デストラクター内のメモリリークダンプを有効または無効にします。Enables and disables the memory leak dump in the AFX_DEBUG_STATE destructor.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

パラメーターParameters

bDumpbDump
からTRUE は、メモリリークダンプが有効であることを示します。FALSE は、メモリリークダンプが無効であることを示します。[in] TRUE indicates the memory leak dump is enabled; FALSE indicates the memory leak dump is disabled.

戻り値Return Value

このフラグの以前の値。The previous value for this flag.

解説Remarks

アプリケーションが MFC ライブラリをアンロードしたときに、MFC ライブラリがメモリ リークを確認します。When an application unloads the MFC library, the MFC library checks for memory leaks. この時点で、Visual Studio の [ デバッグ ] ウィンドウからメモリリークがユーザーに報告されます。At this point, any memory leaks are reported to the user through the Debug window of Visual Studio.

アプリケーションが MFC ライブラリの前に別のライブラリを読み込んだ場合、そのライブラリ内の一部のメモリ割り当てが誤ってメモリ リークとして報告されます。If your application loads another library before the MFC library, some memory allocations in that library will be incorrectly reported as memory leaks. 誤ったメモリ リークが原因で、MFC ライブラリがそれらを報告したときに、アプリケーションがゆっくりと終了する可能性があります。False memory leaks can cause your application to close slowly as the MFC library reports them. このような場合、 AfxEnableMemoryLeakDump を使用してメモリ リーク ダンプを無効にします。In this case, use AfxEnableMemoryLeakDump to disable the memory leak dump.

注意

この方法を使用してメモリ リーク ダンプをオフにすると、アプリケーションで有効なメモリ リークのレポートを受け取らなくなります。If you use this method to turn off the memory leak dump, you will not receive reports of valid memory leaks in your application. この方法を使用するのは、メモリ リーク ダンプに誤ったメモリ リークが含まれているという確信がある場合のみにする必要があります。You should only use this method if you are confident that the memory leak report contains false memory leaks.

要件Requirements

ヘッダー: afxHeader: afx.h

AfxEnableMemoryTrackingAfxEnableMemoryTracking

診断メモリの追跡は、通常、MFC のデバッグバージョンで有効になります。Diagnostic memory tracking is normally enabled in the Debug version of MFC.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

パラメーターParameters

bTrackbTrack
この値を TRUE に設定すると、メモリ追跡が有効になります。FALSE の場合はオフになります。Setting this value to TRUE turns on memory tracking; FALSE turns it off.

戻り値Return Value

追跡-有効化フラグの前の設定。The previous setting of the tracking-enable flag.

解説Remarks

この関数を使用すると、ブロックが正しく割り当てられていることがわかっているコードセクションでの追跡を無効にできます。Use this function to disable tracking on sections of your code that you know are allocating blocks correctly.

の詳細につい AfxEnableMemoryTracking ては、「 MFC アプリケーションのデバッグ」を参照してください。For more information on AfxEnableMemoryTracking, see Debugging MFC Applications.

注意

この関数は、MFC のデバッグバージョンでのみ動作します。This function works only in the Debug version of MFC.

Example

BOOL CMyWinApp::InitInstance()
{
#ifdef _DEBUG
   // Disable tracking of memory for the scope of the InitInstance()
   AfxEnableMemoryTracking(FALSE);
#endif  // _DEBUG

   // ...

#ifdef _DEBUG
   // Re-enable tracking of memory
   AfxEnableMemoryTracking(TRUE);
#endif  // _DEBUG

   return TRUE;
}

要件Requirements

ヘッダー: afxHeader: afx.h

AfxIsMemoryBlockAfxIsMemoryBlock

メモリアドレスをテストして、の診断バージョンによって割り当てられた現在アクティブなメモリブロックを表していることを確認し new ます。Tests a memory address to make sure it represents a currently active memory block that was allocated by the diagnostic version of new.

BOOL AfxIsMemoryBlock(
    const void* p,
    UINT nBytes,
    LONG* plRequestNumber = NULL);

パラメーターParameters

pp
テストするメモリブロックを指します。Points to the block of memory to be tested.

nBytesnBytes
メモリブロックの長さをバイト単位で格納します。Contains the length of the memory block in bytes.

plRequestNumberplRequestNumber
long は、メモリブロックの割り当てシーケンス番号を使用して入力される整数を指します。現在アクティブなメモリブロックを表していない場合は0を指します。Points to a long integer that will be filled in with the memory block's allocation sequence number, or zero if it does not represent a currently active memory block.

戻り値Return Value

メモリブロックが現在割り当てられていて、長さが正しい場合は0以外の値。それ以外の場合は0です。Nonzero if the memory block is currently allocated and the length is correct; otherwise 0.

解説Remarks

また、指定したサイズを、割り当てられた元のサイズと比較して確認します。It also checks the specified size against the original allocated size. 関数が0以外の値を返した場合、割り当てシーケンス番号が Plrequestnumber に返されます。If the function returns nonzero, the allocation sequence number is returned in plRequestNumber. この数は、ブロックが他のすべての割り当てに対して相対的に割り当てられた順序を表し new ます。This number represents the order in which the block was allocated relative to all other new allocations.

Example

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(AfxIsMemoryBlock(pcage, sizeof(CAge)));

要件Requirements

ヘッダー: afxHeader: afx.h

AfxIsValidAddressAfxIsValidAddress

メモリアドレスをテストして、プログラムのメモリ領域内に完全に含まれていることを確認します。Tests any memory address to ensure that it is contained entirely within the program's memory space.

BOOL AfxIsValidAddress(
    const void* lp,
    UINT nBytes,
    BOOL bReadWrite = TRUE);

パラメーターParameters

世代lp
テスト対象のメモリアドレスを指します。Points to the memory address to be tested.

nBytesnBytes
テストするメモリのバイト数を格納します。Contains the number of bytes of memory to be tested.

bReadWritebReadWrite
メモリが読み取りと書き込みのどちらであるか (TRUE)、または読み取りのみである (FALSE) かを指定します。Specifies whether the memory is both for reading and writing (TRUE) or just reading (FALSE).

戻り値Return Value

デバッグビルドでは、指定されたメモリブロックがプログラムのメモリ空間内に完全に含まれている場合は0以外の。それ以外の場合は0です。In debug builds, nonzero if the specified memory block is contained entirely within the program's memory space; otherwise 0.

非デバッグビルドでは、 lp が NULL でない場合は0以外になります。それ以外の場合は0です。In non-debug builds, nonzero if lp is not NULL; otherwise 0.

解説Remarks

アドレスは、によって割り当てられたブロックに制限されません newThe address is not restricted to blocks allocated by new.

Example

// Allocate a 5 character array, which should have a valid memory address.
char* arr = new char[5];

// Create a null pointer, which should be an invalid memory address.
char* null = (char*)0x0;

ASSERT(AfxIsValidAddress(arr, 5));
ASSERT(!AfxIsValidAddress(null, 5));

要件Requirements

ヘッダー: afxHeader: afx.h

AfxIsValidStringAfxIsValidString

文字列へのポインターが有効かどうかを判断するには、この関数を使用します。Use this function to determine whether a pointer to a string is valid.

BOOL  AfxIsValidString(
    LPCSTR lpsz,
    int nLength = -1);

パラメーターParameters

lpszlpsz
テストするポインター。The pointer to test.

nLengthnLength
テストする文字列の長さをバイト単位で指定します。Specifies the length of the string to be tested, in bytes. 値が-1 の場合は、文字列が null で終わることを示します。A value of -1 indicates that the string will be null-terminated.

戻り値Return Value

デバッグビルドでは、指定されたポインターが指定されたサイズの文字列を指している場合は0以外の値。それ以外の場合は0です。In debug builds, nonzero if the specified pointer points to a string of the specified size; otherwise 0.

非デバッグビルドでは、 lpsz が NULL でない場合は0以外になります。それ以外の場合は0です。In non-debug builds, nonzero if lpsz is not NULL; otherwise 0.

Example

// Create a character string which should be valid.
char str[12] = "hello world";

// Create a null pointer, which should be an invalid string.
char* null = (char*)0x0;

ASSERT(AfxIsValidString(str, 12));
ASSERT(!AfxIsValidString(null, 5));

要件Requirements

ヘッダー: afxHeader: afx.h

AfxSetAllocHookAfxSetAllocHook

各メモリブロックが割り当てられる前に、指定された関数の呼び出しを有効にするフックを設定します。Sets a hook that enables calling of the specified function before each memory block is allocated.

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

パラメーターParameters

pfnAllocHookpfnAllocHook
呼び出す関数の名前を指定します。Specifies the name of the function to call. 割り当て関数のプロトタイプについては、「解説」を参照してください。See the Remarks for the prototype of an allocation function.

戻り値Return Value

割り当てを許可する場合は0以外の。それ以外の場合は0です。Nonzero if you want to permit the allocation; otherwise 0.

解説Remarks

Microsoft Foundation Class ライブラリのデバッグメモリアロケーターは、ユーザー定義のフック関数を呼び出して、ユーザーがメモリ割り当てを監視し、割り当てが許可されているかどうかを制御できるようにします。The Microsoft Foundation Class Library debug-memory allocator can call a user-defined hook function to allow the user to monitor a memory allocation and to control whether the allocation is permitted. 割り当て用のフック関数は、次のようにプロトタイプ宣言されます。Allocation hook functions are prototyped as follows:

Bool AFXAPI AllocHook (size_t nSize , bool bObject , LONG lRequestNumber );BOOL AFXAPI AllocHook( size_t nSize, BOOL bObject, LONG lRequestNumber );

nSizenSize
提案されたメモリ割り当てのサイズ。The size of the proposed memory allocation.

bObjectbObject
が派生したオブジェクトの割り当てである場合は TRUE CObject 。それ以外の場合は FALSE。TRUE if the allocation is for a CObject-derived object; otherwise FALSE.

lRequestNumberlRequestNumber
メモリ割り当てのシーケンス番号。The memory allocation's sequence number.

AFXAPI 呼び出し規約は、呼び出し先がスタックからパラメーターを削除する必要があることを意味します。Note that the AFXAPI calling convention implies that the callee must remove the parameters from the stack.

要件Requirements

ヘッダー: afxHeader: afx.h

AfxDoForAllClassesAfxDoForAllClasses

アプリケーションのメモリ領域内のすべてのシリアル化可能な派生クラスに対して、指定された反復関数を呼び出し CObject ます。Calls the specified iteration function for all serializable CObject-derived classes in the application's memory space.

void
AFXAPI AfxDoForAllClasses(
    void (* pfn)(const CRuntimeClass* pClass, void* pContext),
    void* pContext);

パラメーターParameters

pfnpfn
各クラスに対して呼び出される反復関数を指します。Points to an iteration function to be called for each class. 関数の引数は、オブジェクトへのポインター CRuntimeClass と、呼び出し元が関数に提供する追加データへの void ポインターです。The function arguments are a pointer to a CRuntimeClass object and a void pointer to extra data that the caller supplies to the function.

pContextpContext
呼び出し元が反復関数に渡すことができる省略可能なデータを指します。Points to optional data that the caller can supply to the iteration function. このポインターは NULL にすることができます。This pointer can be NULL.

解説Remarks

シリアル化可能 CObject な派生クラスは、DECLARE_SERIAL マクロを使用して派生したクラスです。Serializable CObject-derived classes are classes derived using the DECLARE_SERIAL macro. PContext でに渡されるポインター AfxDoForAllClasses は 、呼び出されるたびに、指定された反復関数に渡されます。The pointer that is passed to AfxDoForAllClasses in pContext is passed to the specified iteration function each time it is called.

注意

この関数は、MFC のデバッグバージョンでのみ動作します。This function works only in the Debug version of MFC.

Example

#ifdef _DEBUG
void DoForAllClasses(const CRuntimeClass* pClass, void* pContext)
{
   ASSERT(pContext != NULL);
   CString* pStr = (CString*)pContext;

   *pStr += pClass->m_lpszClassName;
   *pStr += _T("\n");
}
#endif
#ifdef _DEBUG
CString cStr;
AfxDoForAllClasses(DoForAllClasses, &cStr);
AfxMessageBox(cStr);
#endif

要件Requirements

ヘッダー: afxHeader: afx.h

AfxDoForAllObjectsAfxDoForAllObjects

で割り当てられたから派生したすべてのオブジェクトに対して、指定された反復関数を実行し CObject new ます。Executes the specified iteration function for all objects derived from CObject that have been allocated with new.

void AfxDoForAllObjects(
    void (* pfn)(CObject* pObject, void* pContext),
    void* pContext);

パラメーターParameters

pfnpfn
各オブジェクトに対して実行する反復関数を指します。Points to an iteration function to execute for each object. 関数の引数は、へのポインターであり、 CObject 呼び出し元が関数に提供する余分なデータへの void ポインターです。The function arguments are a pointer to a CObject and a void pointer to extra data that the caller supplies to the function.

pContextpContext
呼び出し元が反復関数に渡すことができる省略可能なデータを指します。Points to optional data that the caller can supply to the iteration function. このポインターは NULL にすることができます。This pointer can be NULL.

解説Remarks

Stack、global、または embedded オブジェクトは列挙されません。Stack, global, or embedded objects are not enumerated. PContext でに渡されるポインターは、呼び出されるたび AfxDoForAllObjects に、指定された反復関数に渡されます。 The pointer passed to AfxDoForAllObjects in pContext is passed to the specified iteration function each time it is called.

注意

この関数は、MFC のデバッグバージョンでのみ動作します。This function works only in the Debug version of MFC.

Example

#ifdef _DEBUG
void DoForAllObjects(CObject* pObject, void* pContext)
{
   int* pnCount = (int*)pContext;

   pObject->AssertValid();
   if (pnCount != NULL)
      (*pnCount)++;
}
#endif // _DEBUG
#ifdef _DEBUG
//AfxDoForAllObjects will call the function DoForAllObjects 
//For each CObject-derived object that is allocated on the heap
int nCount = 0;
AfxDoForAllObjects(DoForAllObjects, &nCount);
TRACE("%d Objects Checked\n", nCount);
#endif

関連項目See also

マクロとグローバルMacros and Globals
CObject::D umpCObject::Dump