Поделиться через


_CrtSetDbgFlag

Извлекает или изменяет состояние флажка _crtDbgFlag к элементу управления расширение функциональности диспетчера выделения отладочной кучи (отладочную версию только).

int _CrtSetDbgFlag( 
   int newFlag 
);

Параметры

  • newFlag
    Новое состояние для _crtDbgFlag.

Возвращаемое значение

Возвращает предыдущее состояние _crtDbgFlag.

Заметки

Функция _CrtSetDbgFlag позволяет приложению в элемент управления как диспетчер отладочной кучи отслеживает выделяемой памяти, изменив битовые поля флажка _crtDbgFlag.Устанавливая биты (включить), приложение может указать диспетчер отладочной кучи выполнения специальные операции отладки, включая обнаружения утечек памяти, когда приложение не влияет на и отчет, были ли найдены, имитируя эмуляции условий нехватки памяти, указав то освобожденные блоки не памяти должно оставаться в связанном списке отладочной кучи и проверки целостности кучи, проверив каждый блок памяти по каждый запрос на выделение.Если _DEBUG не определено, вызовы _CrtSetDbgFlag удаляются во время предварительной обработки.

В следующей таблице перечислены битовые поля для _crtDbgFlag и описывает их расширения функциональности.Поскольку параметр биты является увеличенном диагностическом выходных и снижения скорости выполнения программы, эти биты не установлены (отключенном) по умолчанию.Дополнительные сведения об этих битовых полях см. в разделе Использование отладочной кучи.

Битовое поле

Default

Описание

_CRTDBG_ALLOC_MEM_DF

ON

ON: Enable выделения отладочной кучи и использование идентификаторов типов блоков памяти, например _CLIENT_BLOCK.OFF. Добавьте новые выделения на связанный список кучи, но тип набора блоков в _IGNORE_BLOCK.

Может быть совмещено с любыми макросами проверки куча- частоты.

_CRTDBG_CHECK_ALWAYS_DF

OFF

ON: Вызов _CrtCheckMemory по каждая просьба выделение и освобождение.OFF. необходимо вызывать метод _CrtCheckMemory явно.

Макросы проверки Куча- частоты не имеет эффекта, если этот флажок установлен.

_CRTDBG_CHECK_CRT_DF

OFF

ON: Включите операции обнаружения утечки типов _CRT_BLOCK в и различия в состояния памяти.OFF. Память, используемая внутренне библиотекой CRT, этими операциями.

Может быть совмещено с любыми макросами проверки куча- частоты.

_CRTDBG_DELAY_FREE_MEM_DF

OFF

ON: Keep освободил блоков памяти в связанном списке отладочной кучи, присвоить его тип _FREE_BLOCK, и заполняет их с байтовым значение 0xDD.OFF. Не следует хранить освобожденные блоки в связанном списке отладочной кучи.

Может быть совмещено с любыми макросами проверки куча- частоты.

_CRTDBG_LEAK_CHECK_DF

OFF

ON: Запустите утечку автоматическую проверку на выходе программы посредством вызова метода _CrtDumpMemoryLeaks и создать отчет об ошибке, если приложение не не удалось освободить всю память, он выбирает.OFF. Автоматически не выполняйте утечку проверку на выходе программы.

Может быть совмещено с любыми макросами проверки куча- частоты.

Макросы частоты Куча- проверки

Можно указать, как часто библиотеки времени выполнения C выполняет проверку отладочной кучи (_CrtCheckMemory) на основе количества вызовов malloc, reallocсвободно;бесплатно;бесплатные и _msize.

после этого метод _CrtSetDbgFlag проверяет верхние 16 бит для параметра newFlag значение.Указанное значение числа malloc, realloc, свободно;бесплатно;бесплатные и _msize вызовов между вызовами _CrtCheckMemory.4 Предопределенного макроса предоставляемых для этой цели.

Макрос

Номер 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 (по умолчанию без проверок кучи)

По умолчанию метод _CrtCheckMemory вызывается после 1,024 каждый раз при вызове malloc, reallocсвободно;бесплатно;бесплатные и _msize.

Например, можно указать проверка кучи каждые 16 malloc, realloc, свободно;бесплатно;бесплатные и операции _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);
}

Игнорируются верхние 16 бит параметра newFlag при _CRTDBG_CHECK_ALWAYS_DF определено.В этом случае метод _CrtCheckMemory вызывается каждый раз при вызове malloc, reallocсвободно;бесплатно;бесплатные и _msize.

newFlag нового условия, которые нужно применить к _crtDbgFlag и сочетание значений для каждого из битовых полей.

Изменить одно или несколько из этих битовых полей и создать новое состояние этого флажка.

  1. Вызовите метод _CrtSetDbgFlag с newFlag на _CRTDBG_REPORT_FLAG, чтобы получить текущее состояние _crtDbgFlag и сохранить возвращаемое значение во временной переменной.

  2. Включите все биты OR, применив побитовую операцию временная переменная с соответствующими битовые маски (представленные в коде приложения очевидными константами).

  3. Отключите остальные биты AND, применив побитовую операцию с битовой переменная 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>

Дополнительные сведения о совместимости см. в разделе Совместимость во введении.

Библиотеки

Только отладочные версии Библиотеки времени выполнения языка 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

Основные понятия

Функции создания отчетов о состоянии кучи