메모리 관리 및 디버그 힙
업데이트: 2007년 11월
이 항목은 다음 언어에 적용됩니다.
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
네이티브 전용 |
|||
Standard |
네이티브 전용 |
|||
Pro 및 Team |
네이티브 전용 |
표의 범례:
해당 |
|
해당 없음 |
|
명령은 기본적으로 숨겨져 있습니다. |
프로그래머들이 겪는 가장 일반적이고도 난감한 두 가지 문제는, 할당된 버퍼의 끝 부분을 덮어쓰는 것과 불필요한 할당을 해제할 수 없는 메모리 누수입니다. 디버그 힙을 사용하여 이러한 메모리 할당 문제를 효과적으로 해결할 수 있습니다.
힙 함수의 디버그 버전
힙 함수의 디버그 버전은 릴리스 빌드에서 사용하는 표준 또는 기본 버전을 호출합니다. 메모리 블록을 요청하면 디버그 힙 관리자는 요청한 것 보다 약간 더 큰 메모리 블록을 기본 힙에서 할당하고 블록의 해당 부분에 대한 포인터를 반환합니다. 예를 들어, 응용 프로그램에 malloc( 10 )가 있을 경우, 릴리스 빌드에서는 malloc이 10바이트의 할당을 요청하는 기본 힙 할당 루틴을 호출합니다. 그러나 디버그 빌드에서는 malloc이 10바이트 할당에 더하여 약 36바이트의 추가 메모리를 요청하는 기본 힙 할당 루틴을 호출하는 _malloc_dbg를 호출합니다. 디버그 힙의 모든 결과 메모리 블록은 할당된 순서에 따라 하나의 연결 리스트로 연결됩니다.
디버그 힙 루틴이 할당한 추가 메모리는 할당된 영역의 덮어 쓰기를 찾기 위해 부기 정보, 디버그 메모리 블록을 연결하는 포인터, 데이터 양쪽에 있는 작은 버퍼 등에 사용됩니다.
현재 디버그 힙의 부기 정보를 저장하는 데 사용된 블록 헤더 구조체는 DBGINT.H 헤더 파일에서 다음과 같이 선언됩니다.
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
// Buffer just before (lower than) the user's memory:
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
/* In an actual memory block in the debug heap,
* this structure is followed by:
* unsigned char data[nDataSize];
* unsigned char anotherGap[nNoMansLandSize];
*/
블록의 사용자 데이터 양 영역의 NoMansLand 버퍼 크기는 현재 4바이트이며, 사용자의 메모리 블록 한계를 덮어쓰지 않았다는 것을 확인하기 위해 디버그 힙 루틴이 사용하는 알려진 바이트 값으로 채워져 있습니다. 디버그 힙은 또한 새로운 메모리 블록을 알려진 값으로 채웁니다. 아래에서 설명한 대로 힙의 연결 리스트에 빈 블록을 유지하도록 선택하면 이러한 빈 블록도 알려진 값으로 채워집니다. 현재 실제 사용된 바이트 값은 다음과 같습니다.
NoMansLand(0xFD)
응용 프로그램이 사용하는 메모리의 "NoMansLand" 버퍼는 현재 0xFD로 채워져 있습니다.빈 블록(0xDD)
_CRTDBG_DELAY_FREE_MEM_DF 플래그를 설정할 경우 디버그 힙의 연결 리스트에서 사용하지 않는 빈 블록은 현재 0xDD로 채워져 있습니다.새로운 개체(0xCD)
새로운 개체는 할당될 때 0xCD로 채워 집니다.