Share via


_CrtSetDbgFlag

검색 또는 상태를 수정 된 _crtDbgFlag 할당 하면 디버그 힙 관리자 (디버그 버전에만 해당)의 동작을 제어 하는 플래그.

int _CrtSetDbgFlag( 
   int newFlag 
);

매개 변수

  • newFlag
    새 상태에 대 한 _crtDbgFlag.

반환 값

이전 상태를 반환 합니다. _crtDbgFlag.

설명

_CrtSetDbgFlag 함수가 있습니다 디버그 힙 관리자 할당 메모리의 비트 필드를 수정 하 여 추적 하는 방법을 제어 하는 응용 프로그램의 _crtDbgFlag 플래그.(켜기) 비트를 설정 하 여 응용 프로그램 디버그 힙 관리자 응용 프로그램이 종료 될 때 메모리 누수 확인 및 보고 발견 된 경우, 해제 된 메모리 블록은 힙의 연결된 리스트에 보관 해야 하는 지정 하 고 각 메모리 블록에 할당 되는 모든 요청을 검사 하 여 힙의 무결성을 확인 하 여 부족 한 메모리 조건을 시뮬레이션 하는 특수 한 디버깅 작업을 수행 하도록 지시할 수 있습니다.때 _DEBUG 정의 되지 않은 경우에 호출 _CrtSetDbgFlag 전처리 하는 동안 제거 됩니다.

다음 표에서 비트 필드에 대 한 _crtDbgFlag 동작에 설명 합니다.비트 결과 진단 출력 증가 및 감소 프로그램 실행 속도 설정 하므로 이러한 비트 (기본적으로 해제) 설정 되지 않았습니다.이 대 한 자세한 내용은 비트 필드를 참조 하십시오 디버그 힙 사용.

비트 필드

Default

설명

_CRTDBG_ALLOC_MEM_DF

ON

: ON을 같은 디버그 힙 할당 한 메모리 블록 형식 식별자를 사용 사용 _CLIENT_BLOCK.OFF: 새 할당 힙의 연결된 리스트에 추가 되지만 설정 블록 형식에 _IGNORE_BLOCK.

또한 힙 주파수 체크 매크로 중 하나를 결합할 수 있습니다.

_CRTDBG_CHECK_ALWAYS_DF

OFF

ON: 호출 _CrtCheckMemory 에서 모든 할당 및 할당 취소 요청 합니다.OFF: _CrtCheckMemory 명시적으로 호출 해야 합니다.

이 플래그를 설정 하면 힙의 주파수 체크 매크로 효과가 없습니다.

_CRTDBG_CHECK_CRT_DF

OFF

ON: 포함 _CRT_BLOCK 누수 감지 및 메모리 상태에서 형식 차이 작업 합니다.꺼짐: 런타임 라이브러리에 의해 내부적으로 사용 되는 메모리는 이러한 작업에서 무시 됩니다.

또한 힙 주파수 체크 매크로 중 하나를 결합할 수 있습니다.

_CRTDBG_DELAY_FREE_MEM_DF

OFF

ON: 유지 메모리 힙 블록의 목록 연결 해제, 할당 된 _FREE_BLOCK 입력 하 여 0xDD 바이트 값으로 채우는.꺼짐: 있는 힙의 연결된 리스트에 빈된 블록을 두지 마십시오.

또한 힙 주파수 체크 매크로 중 하나를 결합할 수 있습니다.

_CRTDBG_LEAK_CHECK_DF

OFF

ON: 자동 누수 검사를 호출 하 여 프로그램 종료 시 수행 _CrtDumpMemoryLeaks 및 할당 된 모든 메모리를 확보 하려면 응용 프로그램이 실패 하면 오류 보고서를 생성 합니다.OFF: 자동으로 누수 확인 프로그램 종료 시 수행 하지 않습니다.

또한 힙 주파수 체크 매크로 중 하나를 결합할 수 있습니다.

힙 검사 빈도 매크로

C 런타임 라이브러리의 디버그 힙 유효성 검사를 수행 하는 빈도 지정할 수 있습니다 (_CrtCheckMemory)에 대 한 호출 수에 따라 malloc, realloc, 무료, 및 _msize.

_CrtSetDbgFlag다음의 상위 16 비트를 검사 하는 newFlag 매개 변수 값에 대 한.지정 된 값의 수 malloc, realloc, 무료, 및 _msize 호출 간에 _CrtCheckMemory 호출 합니다.네 개의 미리 정의 된 매크로이 목적을 위해 제공 됩니다.

매크로

_Crtcheckmemory를 호출 간에 realloc 무료, _msize malloc 호출 수입니다.

_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를 지정 하면 매개 변수가 무시 됩니다.In this case, _CrtCheckMemory is called each time you call malloc, realloc, free, and _msize.

newFlag적용 하려면 새 상태는 _crtDbgFlag 하 고 조합 된 값의 각 비트 필드에 대 한.

이 비트 필드 중 하나를 변경 하 고 플래그에 새로운 상태를 만드는

  1. 호출 _CrtSetDbgFlag 와 newFlag 같은 _CRTDBG_REPORT_FLAG 현재를 구하려면 _crtDbgFlag 명시 하 고 반환된 값을 임시 변수에 저장 합니다.

  2. 모든 비트 설정 OR-ing 해당 비트 마스크 (응용 프로그램 코드에서 상수로 표시)로 임시 변수입니다.

  3. 여 나머지 비트를 해제 AND연산 연산을 사용 하 여 변수 하지 의 알맞은.

  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 비트를 사용 하 여 변수 하지 비트 마스크의.

경우 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

개념

힙 상태 보고 함수