次の方法で共有


_CrtSetDbgFlag

を取得またはデバッグ ヒープ マネージャー (デバッグ バージョンだけ) の動作を制御するために _crtDbgFlag のフラグの状態を変更します。

int _CrtSetDbgFlag( 
   int newFlag 
);

パラメーター

  • newFlag
    _crtDbgFlagの新しい状態。

戻り値

_crtDbgFlagの以前の状態を返します。

解説

_CrtSetDbgFlag 関数は、フラグを設定するか _crtDbgFlag の bit のフィールドの変更によるデバッグ ヒープ マネージャーの追跡のメモリ割り当てを制御できます。bit の配置 (有効) によって、アプリケーションは模倣したアプリケーションをヒープのリンク リスト、各メモリ ブロックを調べることによって、割り当て要求のヒープの整合性を検証するために、レポートを指定して、メモリ不足の状態を解放されたメモリ ブロックを維持する必要があります終了すると、デバッグ ヒープ マネージャーにメモリ リークをチェックを含む特別なデバッグ操作を実行するように指示できます。_DEBUG が未定義の場合、_CrtSetDbgFlag の呼び出しはプリプロセスで削除されます。

次の表は、_crtDbgFlag の bit のフィールドを一覧し、動作について説明します。bit を設定することも、診断出力と、プログラムの実行速度を向上するため、これらの bit (既定ではオフ) は設定されません。これらの bit のフィールドに関する詳細については、デバッグ ヒープの使用法を参照してください。

ビット フィールド

既定値

説明

_CRTDBG_ALLOC_MEM_DF

ON

: _CLIENT_BLOCKなどのメモリ ブロック型識別子のデバッグ ヒープの割り当てと使用を有効にします。から: _IGNORE_BLOCKにヒープのリンク リスト、ブロックの型に新しい割り当てを追加します。

また、ヒープ間隔のチェックのマクロのいずれかとまとめることができます。

_CRTDBG_CHECK_ALWAYS_DF

OFF

: の割り当ておよび解放の要求では _CrtCheckMemory。から: _CrtCheckMemory を明示的に呼び出す必要があります。

ヒープ間隔のチェックのマクロは、このフラグが設定されている場合には影響しません。

_CRTDBG_CHECK_CRT_DF

OFF

: _CRT_BLOCK を入力してメモリ リークの検出やメモリ状態の違いの操作を含めます。から: ランタイム ライブラリによって内部的に使用されるメモリはこれらの操作では無視されます。

また、ヒープ間隔のチェックのマクロのいずれかとまとめることができます。

_CRTDBG_DELAY_FREE_MEM_DF

OFF

: keep ヒープのリンク リストのメモリ ブロックを解放し、_FREE_BLOCK の型を再配置、およびバイト値 0xDD で塗りつぶします。から: ヒープのリンク リストに解放されたブロックを格納しないでください。

また、ヒープ間隔のチェックのマクロのいずれかとまとめることができます。

_CRTDBG_LEAK_CHECK_DF

OFF

: アプリケーションが割り当てたメモリを解放せずに _CrtDumpMemoryLeaks 使用してプログラムの終了時にメモリ リークをチェックする自動実行し、エラーのレポートを生成します。から: 自動的にチェックするプログラムの終了時にメモリ リークを実行しないでください。

また、ヒープ間隔のチェックのマクロのいずれかとまとめることができます。

ヒープ チェックする頻度のマクロ

頻度で C のランタイム ライブラリが mallocrealloc、および free_msizeへの呼び出しの数に基づいてデバッグ ヒープ上**_CrtCheckMemory**) の検証を実行するかを指定できます。

_CrtSetDbgFlag 値がの場合、newFlag のパラメーターの上位 16 ビットの bit を検査します。指定された値は _CrtCheckMemory の呼び出しの間 mallocrealloc、および free_msize の呼び出しの数です。4 種類の定義済みマクロはこのするために使用されます。

マクロ

malloc、realloc、可用性の数は_CrtCheckMemory に、呼び出しの間の呼び出しを_msize

_CRTDBG_CHECK_EVERY_16_DF

16

_CRTDBG_CHECK_EVERY_128_DF

128

_CRTDBG_CHECK_EVERY_1024_DF

1024

_CRTDBG_CHECK_DEFAULT_DF

0 (既定では、ヒープ チェックなし)

既定では、_CrtCheckMemory は 1,024 時間ごとに mallocrealloc、および free_msizeを呼び出すと呼ばれます。

たとえば、次のコードの 16 mallocごとに、realloc、および free_msize 操作ヒープのチェックを指定できます:

#include <crtdbg.h>
int main( )
{
int tmp;

// Get the current bits
tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);

// Clear the upper 16 bits and OR in the desired freqency
tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;

// Set the new bits
_CrtSetDbgFlag(tmp);
}

newFlag のパラメーターの上位 16 ビットの bit は_CRTDBG_CHECK_ALWAYS_DF が指定されている場合は無視されます。この場合、_CrtCheckMemorymallocrealloc、および free_msizeを呼び出すたびに呼び出されます。

newFlag は _crtDbgFlag に適用する新しい状態で、bit の各フィールドの値の組み合わせです。

これらの bit の一つ以上のフィールドを変更してフラグの新しい状態を作成するには

  1. _crtDbgFlag の現在の状態を取得およびテンポラリ変数に戻り値を格納するには _CRTDBG_REPORT_FLAG と同じ newFlag の _CrtSetDbgFlag を呼び出します。

  2. ORで、ビット ~) との対応するビット マスクの一時変数オンにします (マニフェスト定数に、アプリケーション コードでは)。

  3. ANDで他の bit ~) とを適切なビット マスク ビットごとの NOT の変数にオフにします。

  4. _crtDbgFlagの新しい状態を設定するために一時変数に格納されている値と等しい newFlag の _CrtSetDbgFlag を呼び出します。

次のコードは、メモリ不足の状態をヒープのリンク リストに解放されたメモリ ブロックを保持することによってシミュレートし、割り当て要求に示します _CrtCheckMemory が呼び出されるようにする方法を:

// Get the current state of the flag
// and store it in a temporary variable
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );

// Turn On (OR) - Keep freed memory blocks in the
// heap's linked list and mark them as freed
tmpFlag |= _CRTDBG_DELAY_FREE_MEM_DF;

// Turn Off (AND) - prevent _CrtCheckMemory from
// being called at every allocation request
tmpFlag &= ~_CRTDBG_CHECK_ALWAYS_DF;

// Set the new state for the flag
_CrtSetDbgFlag( tmpFlag );

メモリ管理とデバッグ ヒープの概要については、メモリ管理とデバッグ ヒープを参照してください。

_CrtSetDbgFlag 関数のフラグを無効にするには、AND ビット マスク ビットごとの NOT の変数に必要です。

newFlag 値が有効でない場合、この関数は パラメーターの検証に説明されているように、無効なパラメーター ハンドラーが実行されます。実行の継続が許可 EINVAL と戻り値へのこの関数のセット errno_crtDbgFlagの前の状態。

必要条件

ルーチン

必須ヘッダー

_CrtSetDbgFlag

<crtdbg.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

ライブラリ

C ランタイム ライブラリのデバッグ バージョンのみ。

使用例

// crt_crtsetdflag.c
// compile with: /c -D_DEBUG /MTd -Od -Zi -W3 /link -verbose:lib /debug
/*
 * This program concentrates on allocating and freeing memory
 * blocks to test the functionality of the _crtDbgFlag flag..
 */

#include <string.h>
#include <malloc.h>
#include <crtdbg.h>

int main( )
{
        char *p1, *p2;
        int tmpDbgFlag;

        _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
        _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );
        /*
         * Set the debug-heap flag to keep freed blocks in the
         * heap's linked list - This will allow us to catch any
         * inadvertent use of freed memory
         */
        tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
        tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
        tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
        _CrtSetDbgFlag(tmpDbgFlag);

        /*
         * Allocate 2 memory blocks and store a string in each
         */
        p1 = malloc( 34 );
        p2 = malloc( 38 );
        strcpy_s( p1, 34, "p1 points to a Normal allocation block" );
        strcpy_s( p2, 38, "p2 points to a Client allocation block" );

        /*
         * Free both memory blocks
         */
        free( p2 );
        free( p1 );

        /*
         * Set the debug-heap flag to no longer keep freed blocks in the
         * heap's linked list and turn on Debug type allocations (CLIENT)
         */
        tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
        tmpDbgFlag |= _CRTDBG_ALLOC_MEM_DF;
        tmpDbgFlag &= ~_CRTDBG_DELAY_FREE_MEM_DF;
        _CrtSetDbgFlag(tmpDbgFlag);

        /*
         * Explicitly call _malloc_dbg to obtain the filename and 
         * line number of our allocation request and also so we can 
         * allocate CLIENT type blocks specifically for tracking
         */
        p1 = _malloc_dbg( 40, _NORMAL_BLOCK, __FILE__, __LINE__ );
        p2 = _malloc_dbg( 40, _CLIENT_BLOCK, __FILE__, __LINE__ );
        strcpy_s( p1, 40, "p1 points to a Normal allocation block" );
        strcpy_s( p2, 40, "p2 points to a Client allocation block" );

        /*
         * _free_dbg must be called to free the CLIENT block
         */
        _free_dbg( p2, _CLIENT_BLOCK );
        free( p1 );

        /*
         * Allocate p1 again and then exit - this will leave unfreed
         * memory on the heap
         */
        p1 = malloc( 10 );
}

同等の .NET Framework 関数

該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

関連項目

デバッグ ルーチン

_crtDbgFlag

_CrtCheckMemory

概念

ヒープの状態をレポートする関数