_CrtSetDbgFlag

擷取或修改 _crtDbgFlag 旗標狀態控制偵錯堆積管理員的配置行為 (僅偵錯版本)。

int _CrtSetDbgFlag( 
   int newFlag 
);

參數

  • newFlag
    _crtDbgFlag的新狀態。

傳回值

傳回 _crtDbgFlag先前的狀態。

備註

_CrtSetDbgFlag 函式可讓應用程式控制偵錯堆積管理員如何藉由修改 _crtDbgFlag 旗標的位元欄位會追蹤記憶體配置。藉由設定位元 (開啟),應用程式可以將偵錯堆積管理員執行特殊偵錯作業,包括檢查記憶體遺漏,當應用程式在堆積的連結串列和驗證完成和報告,如果發現任何,模擬低記憶體情況。您可以指定已釋放的記憶體區塊應該保持在堆積完整性檢查每個記憶體區塊旁邊每次配置要求。如果未定義 _DEBUG 時,在前置處理中,對 _CrtSetDbgFlag 的呼叫中移除。

下表列出 _crtDbgFlag 的位元欄位和描述其行為。由於設定位元會增加的診斷輸出並降低程式執行速度,這些位元設定為 (關閉) 預設為。如需這些位元欄位的詳細資訊,請參閱 使用偵錯堆積

位元欄位

Default

描述

_CRTDBG_ALLOC_MEM_DF

ON

在:enable 偵錯對記憶體區塊類型識別項的堆積配置和用途,例如 _CLIENT_BLOCK。:對堆積的連結清單中加入新的配置,不過,設定區塊類型對 _IGNORE_BLOCK

也可以與任何堆積頻率檢查巨集。

_CRTDBG_CHECK_ALWAYS_DF

OFF

在:在每一次配置和解除配置要求上呼叫 _CrtCheckMemory 。:必須明確呼叫 _CrtCheckMemory

當設定這個旗標時,堆積頻率檢查巨集不會有任何作用。

_CRTDBG_CHECK_CRT_DF

OFF

在:包含 _CRT_BLOCK 項目漏水檢測和記憶體狀態差異作業。:這個執行階段程式庫在內部使用的記憶體由這些作業會忽略。

也可以與任何堆積頻率檢查巨集。

_CRTDBG_DELAY_FREE_MEM_DF

OFF

在:保持釋放了堆積的連結串列的記憶體區塊,將這些 _FREE_BLOCK 型別,並以位元組值 0xDD 填入。:不要保留釋放區塊堆積的連結串列。

也可以與任何堆積頻率檢查巨集。

_CRTDBG_LEAK_CHECK_DF

OFF

在:執行檢查程序結束時自動遺漏藉由呼叫 _CrtDumpMemoryLeaks 並產生錯誤報告應用程式沒有釋放所有記憶體配置它。:不要自動執行檢查程式結束的遺漏。

也可以與任何堆積頻率檢查巨集。

堆積檢查頻率巨集

您的頻率可以指定根據呼叫數目 (_CrtCheckMemory) 的 C 執行階段程式庫執行驗證偵錯堆積呼叫 mallocrealloc_msizefree

_CrtSetDbgFlag 會檢查 newFlag 參數的較高的 16 位元值。指定的值為 mallocrealloc_msizefree和呼叫數目 _CrtCheckMemory 呼叫之間。提供這個的四個預先定義巨集。

巨集

malloc, realloc,可用數值,以及 _msize 在呼叫之間的呼叫 _CrtCheckMemory

_CRTDBG_CHECK_EVERY_16_DF

16

_CRTDBG_CHECK_EVERY_128_DF

128

_CRTDBG_CHECK_EVERY_1024_DF

1024

_CRTDBG_CHECK_DEFAULT_DF

0 (根據預設,不含堆積檢查)

根據預設,,一旦每 1,024 次呼叫 mallocreallocfree_msize,呼叫 _CrtCheckMemory

例如,您可以指定堆積檢查每 16 mallocrealloc_msizefree作業與下列程式碼:

#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);
}

當 _CRTDBG_CHECK_ALWAYS_DF 指定時, newFlag 參數表示的 16 位元被忽略。在這種情況下,,每次呼叫 mallocreallocfree_msize,呼叫 _CrtCheckMemory

newFlag 是套用的新狀態於 _crtDbgFlag 和是值的組合中每個的位元欄位。

變更一或多個位元欄位和建立旗標的新狀態

  1. 呼叫 _CrtSetDbgFlag 和 newFlag 等於 _CRTDBG_REPORT_FLAG 取得目前 _crtDbgFlag 狀態和儲存傳回的值在暫存變數。

  2. 由 OR將所有位元- ing 裝置與對應的位元遮罩的暫存變數 (表示在應用程式程式碼由資訊清單常數)。

  3. AND關閉其他位元- ing 與適當的位元遮罩中的位元 NOT 的變數。

  4. 呼叫 _CrtSetDbgFlag 和 newFlag 等於值在暫存變數儲存設定 _crtDbgFlag的新狀態。

下列程式碼示範如何將釋放的記憶體區塊模擬低記憶體情況堆積的連結串列和防止 _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 不是有效的值,這個函式叫用無效的參數處理常式,如 參數驗證中所述。如果執行允許繼續,這個函式會將 errno 設定為 EINVAL 和 _crtDbgFlag傳回之前的狀態。

需求

程序

必要的標頭檔

_CrtSetDbgFlag

<crtdbg.h>

如需更多關於相容性的資訊,請參閱入門介紹中的 相容性 (Compatibility)

程式庫

C run-time libraries 版本的偵錯

範例

// 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。如需更多的資訊,請參閱 Platform Invoke Examples

請參閱

參考

偵錯常式

_crtDbgFlag

_CrtCheckMemory

概念

堆積狀態報告函式