_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
)의 유효성 검사를 수행하는 빈도를 realloc
free
지정할 수 있습니다_msize
.malloc
그런 다음 _CrtSetDbgFlag
함수는 값의 newFlag
매개 변수에 대해 상위 16비트를 검사합니다. 지정된 값은 호출 사이의 , , 및 호출 수malloc
입니다_msize
. free
realloc
_CrtCheckMemory
이러한 용도로 미리 정의된 매크로 4개가 제공됩니다.
매크로 | 에 대한 호출 수 malloc , realloc free 및 _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
개, 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 frequency
tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;
// Set the new bits
_CrtSetDbgFlag(tmp);
}
매개 변수의 newFlag
상위 16비트가 지정되면 _CRTDBG_CHECK_ALWAYS_DF
무시됩니다. 이 경우 호출할 _CrtCheckMemory
때마다 malloc
, realloc
free
및 _msize
.
newFlag
는 적용 _crtDbgFlag
할 새 상태이며 각 비트 필드에 대한 값의 조합입니다.
이러한 비트 필드를 하나 이상 변경하고 플래그에 새로운 상태를 만들려면
newFlag
같음으로 호출_CrtSetDbgFlag
하여_CRTDBG_REPORT_FLAG
현재_crtDbgFlag
상태를 가져오고 반환된 값을 임시 변수에 저장합니다.해당 비트 마스크(매니페스트 상수로 애플리케이션 코드에 표시됨)를 사용하여 임시 변수의 비트 "또는" (
|
)로 모든 비트를 켭니다.적절한 비트 마스크의 비트가 "not"(
&
)인 변수의 비트 "and"(~
)로 다른 비트를 끕니다.임시 변수에 저장된 값과
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
이 함수는 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기를 호출합니다. 계속해서 실행하도록 허용한 경우 함수는 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 );
}