디버그 힙의 블록 형식
이 항목은 다음 언어에 적용됩니다.
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
네이티브 전용 |
||||
Pro, Premium 및 Ultimate |
네이티브 전용 |
디버그 힙의 모든 메모리 블록은 다섯 가지 할당 형식 중 하나에 지정됩니다. 누수 탐지와 상태 보고 등의 목적에 따라 이러한 형식을 다르게 추적하고 보고합니다. _malloc_dbg와 같은 디버그 힙 할당 함수 중 하나를 직접 호출하여 블록을 할당하면 블록의 형식을 지정할 수 있습니다. 디버그 힙에 있는 메모리 블록 형식(_CrtMemBlockHeader 구조체의 nBlockUse 멤버에 설정) 다섯 가지는 다음과 같습니다.
_NORMAL_BLOCK
malloc이나 calloc을 호출하면 표준 블록이 만들어집니다. 표준 블록만 사용하고 클라이언트 블록은 사용하지 않으려면 모든 힙 할당 호출을 디버그 빌드의 해당 디버그 부분에 매핑시키는 _CRTDBG_MAP_ALLOC을 정의해야 합니다. 그러면 각 할당 호출에 대한 파일 이름과 줄 번호 정보가 해당 블록 헤더에 저장됩니다._CRT_BLOCK
여러 런타임 라이브러리 함수에 의해 내부적으로 할당된 메모리 블록은 CRT 블록으로 표시되어 별도로 처리될 수 있습니다. 결과적으로 누수 탐지나 다른 작업들이 런타임 라이브러리 함수의 영향을 받지 않습니다. 할당은 CRT 형식의 어떠한 블록도 할당하거나 할당 취소하거나 해제할 수 없습니다._CLIENT_BLOCK
응용 프로그램은 지정한 할당 그룹을 이 형식의 메모리 블록으로 할당함으로써 디버깅을 위해 이 할당 그룹을 특별히 추적하여 디버그 힙 함수를 명시적으로 호출할 수 있습니다. 예를 들어, MFC는 모든 CObjects를 클라이언트 블록으로 할당하며, 다른 응용 프로그램들은 클라이언트 블록에 여러 메모리 개체를 가질 수 있습니다. 또한 보다 정교하게 추적하도록 클라이언트 블록의 하위 형식을 지정할 수 있습니다. 클라이언트 블록의 하위 형식을 지정하려면 16비트로 남긴 숫자를 변환하고 _CLIENT_BLOCK으로 OR연산을 실행하십시오. 예를 들면 다음과 같습니다.#define MYSUBTYPE 4 freedbg(pbData, _CLIENT_BLOCK|(MYSUBTYPE<<16));
클라이언트 블록에 저장된 개체를 덤프하기 위해 _CrtSetDumpClient를 사용하여 클라이언트 제공 후크 함수를 설치할 수 있으며, 설치 후 디버그 함수가 클라이언트 블록을 덤프할 때마다 호출됩니다. 또한 _CrtDoForAllClientObjects를 사용하여 디버그 힙에 있는 모든 클라이언트 블록에 대해 응용 프로그램이 제공하는 지정한 함수를 호출할 수 있습니다.
_FREE_BLOCK
대개 빈 블록은 리스트에서 제거됩니다. 빈 블록을 Free로 표시하고 알려진 바이트 값(현재 0xDD)으로 채워 연결 리스트에 보관하여, 빈 메모리가 아직 작성되지 않았는지 확인하거나 낮은 메모리 조건을 시뮬레이션할 수 있습니다._IGNORE_BLOCK
일정한 시간 동안 디버그 힙 연산을 해제할 수 있습니다. 그 동안 메모리 블록은 리스트에 보관되지만 무시 블록으로 표시됩니다.
지정한 블록의 형식 및 하위 형식을 확인하려면 함수 _CrtReportBlockType과 매크로 _BLOCK_TYPE과 _BLOCK_SUBTYPE을 사용하십시오. 매크로는 crtdbg.h에서 다음과 같이 정의됩니다.
#define _BLOCK_TYPE(block) (block & 0xFFFF)
#define _BLOCK_SUBTYPE(block) (block >> 16 & 0xFFFF)