다음을 통해 공유


_CrtSetDbgFlag

디버그 힙 관리자의 _crtDbgFlag 할당 동작을 제어하기 위해 플래그의 상태를 검색하거나 수정합니다(디버그 버전에만 해당).

구문

int _CrtSetDbgFlag(
   int newFlag
);

매개 변수

newFlag
에 대한 _crtDbgFlag새 상태입니다.

반환 값

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

설명

_CrtSetDbgFlag 함수를 사용하면 애플리케이션에서 디버그 힙 관리자가 플래그의 비트 필드를 수정하여 메모리 할당을 추적하는 방법을 제어할 _crtDbgFlag 수 있습니다. 애플리케이션은 비트 필드를 설정하여 디버그 힙 관리자에게 특별한 디버깅 작업을 수행하도록 지시할 수 있습니다. 다음과 같은 몇 가지 가능한 작업이 있습니다.

  • 애플리케이션이 종료될 때 메모리 누수 확인 및 발견된 경우 보고
  • 해제된 메모리 블록이 힙의 연결된 목록에 유지되도록 지정하여 메모리 부족 조건 시뮬레이션
  • 모든 할당 요청에서 각 메모리 블록을 검사하여 힙의 무결성을 확인합니다.

_DEBUG가 정의되지 않은 경우 전처리 중에 _CrtSetDbgFlag에 대한 호출이 제거됩니다.

다음 표에서는 해당 동작에 대한 _crtDbgFlag 비트 필드를 나열하고 설명합니다. 비트를 설정하면 진단 출력이 증가하고 프로그램 실행 속도가 감소하기 때문에 이러한 비트는 기본적으로 설정(해제)되지 않습니다. 이러한 비트 필드에 대한 자세한 내용은 힙 상태 보고 함수를 참조 하세요.

비트 필드 기본값 설명
_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 형식을 포함합니다. OFF: 런타임 라이브러리에서 내부적으로 사용되는 메모리는 이러한 작업에서 무시됩니다.

또한 힙 빈도 확인 매크로 중 하나와 함께 사용할 수도 있습니다.
_CRTDBG_DELAY_FREE_MEM_DF OFF ON: 해제된 메모리 블록을 힙의 연결된 목록에 유지하고, 형식을 _FREE_BLOCK 할당하고, 바이트 값 0xDD 채웁니다. OFF: 해제된 블록을 힙의 연결된 목록에 유지하지 마세요.

또한 힙 빈도 확인 매크로 중 하나와 함께 사용할 수도 있습니다.
_CRTDBG_LEAK_CHECK_DF OFF ON: 호출 _CrtDumpMemoryLeaks 을 통해 프로그램 종료 시 자동 누수 검사를 수행하고 애플리케이션이 할당된 모든 메모리를 해제하지 못한 경우 오류 보고서를 생성합니다. OFF: 프로그램 종료 시 누출 검사를 자동으로 수행하지 마세요.

또한 힙 빈도 확인 매크로 중 하나와 함께 사용할 수도 있습니다.

힙 검사 빈도 매크로

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

그런 다음 _CrtSetDbgFlag 함수는 값의 newFlag 매개 변수에 대해 상위 16비트를 검사합니다. 지정된 값은 호출 사이의 , , 및 호출 수malloc입니다_msize. freerealloc_CrtCheckMemory 이러한 용도로 미리 정의된 매크로 4개가 제공됩니다.

매크로 에 대한 호출 수 malloc, reallocfree_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 메모리 작업 중에는 호출되지 않습니다. 위에 _CrtSetDbgFlag()표시된 플래그를 .으로 전송하여 변경할 수 있습니다.

예를 들어 다음 코드를 사용하여 16malloc개, reallocfree_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 frequency
    tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;

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

매개 변수의 newFlag 상위 16비트가 지정되면 _CRTDBG_CHECK_ALWAYS_DF 무시됩니다. 이 경우 호출할 _CrtCheckMemory 때마다 malloc, reallocfree_msize.

newFlag 는 적용 _crtDbgFlag 할 새 상태이며 각 비트 필드에 대한 값의 조합입니다.

이러한 비트 필드를 하나 이상 변경하고 플래그에 새로운 상태를 만들려면

  1. newFlag 같음으로 호출 _CrtSetDbgFlag 하여 _CRTDBG_REPORT_FLAG 현재 _crtDbgFlag 상태를 가져오고 반환된 값을 임시 변수에 저장합니다.

  2. 해당 비트 마스크(매니페스트 상수로 애플리케이션 코드에 표시됨)를 사용하여 임시 변수의 비트 "또는" (|)로 모든 비트를 켭니다.

  3. 적절한 비트 마스크의 비트가 "not"(&)인 변수의 비트 "and"(~)로 다른 비트를 끕니다.

  4. 임시 변수에 저장된 값과 newFlag 같게 호출 _CrtSetDbgFlag 하여 새 상태를 _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 );

메모리 관리 및 디버그 힙에 대한 개요는 CRT 디버그 힙 세부 정보를 참조 하세요.

함수를 사용하여 플래그 _CrtSetDbgFlag 를 사용하지 않도록 설정하려면 비트 마스크의 비트 "not"(&)와 함께 변수의 비트 "and"(~)를 사용합니다.

유효한 값이 아닌 경우 newFlag 이 함수는 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기를 호출합니다. 계속해서 실행하도록 허용한 경우 함수는 errnoEINVAL로 설정하고 _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 );
}

참고 항목

디버그 루틴
_crtDbgFlag
_CrtCheckMemory