_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 하 고 조합 된 값의 각 비트 필드에 대 한.
이 비트 필드 중 하나를 변경 하 고 플래그에 새로운 상태를 만드는
호출 _CrtSetDbgFlag 와 newFlag 같은 _CRTDBG_REPORT_FLAG 현재를 구하려면 _crtDbgFlag 명시 하 고 반환된 값을 임시 변수에 저장 합니다.
모든 비트 설정 OR-ing 해당 비트 마스크 (응용 프로그램 코드에서 상수로 표시)로 임시 변수입니다.
여 나머지 비트를 해제 AND연산 연산을 사용 하 여 변수 하지 의 알맞은.
호출 _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. 자세한 내용은 플랫폼 호출 예제.