~cpp _crtDbgFlag ¶| _CRTDBG_ALLOC_MEM_DF | 디버그 할당 활성화. free store 상태 추적 |
| _CRTDBG_DELAY_FREE_MEM_DF | 메모리를 delete에 의해 해지 되지 않도록함. 메모리 부족상황하에 발생하는 일을 알 수 잇음 |
| _CRTDBG_CHECK_ALWAYS_DF | _CrtCheckMemory() 함수를 모든 new, delete 함수에 대해서 자동 호출 되도록 지정한다. 이 함수는 할당된 공간의 유효성을 지속적으로 체크한다. 즉 domainerror나 기타 메모리 access에 관한 부분을 검사한다. 대신 오버헤드가 상당하다. 그러나 그만큼 디버깅의 효율성을 높여줄 수 있다. |
| _CRTDBG_CHECK_CRT_DF | 내부적으로 사용되는 메모리가 디버그작업을 하는 동안 추적된다. |
| _CRTDBG_LEAK_CHECK_DF | 프로그램이 종료되는 시점에서 _CrtDumpMemoryLeaks()를 호출. 메모리 해제에 실패한 경우 그 정보를 얻을 수 있다. |
~cpp int flas = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); flag |= _CRTDBG_LEAK_CHECK_DF; // 플래그 on flag &= !_CRTDBG_LEAK_CHECK_DF; // 플래그 off _CrtSetDbgFlag(flag);
~cpp
//this define must occur before any headers are included.
//반드시 include 전처리기의 앞부분에 선언되어야함.
#define _CRTDBG_MAP_ALLOC
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
// include crtdbg.h after all other headers.
// 전처리 문장이 끝난뒤에 include
#include <crtdbg.h>
int main(int argc, char *argv[]) {
//turn on the full heap checking
//DCRT의 오버헤드가 상당하기 때문에 기본옵션이 꺼져있다고 한다. 따라서 다음과 같이 옵션을 활성화 하는 작업이 필요
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF |
_CRTDBG_CHECK_ALWAYS_DF |
_CRTDBG_DELAY_FREE_MEM_DF |
_CRTDBG_LEAK_CHECK_DF );
//Allocate some more memory.
TCHAR* pNew = new TCHAR[200];
TCHAR* pNew2 = new TCHAR[200];
TCHAR* pMemLeak = (TCHAR*)malloc (100);
_tcscpy( pNew, _T("New'd memory...") );
_tcscpy( pNew2, _T("more New'd memory...") );
_tcscpy( pMemLeak, _T("Malloc'd memory...") );
return EXIT_SUCCESS;
}
~cpp int _CrtSetReportMode(int reportType, int reportMode);
| _CRT_WARN | 경고 메시지 예)memory leak |
| _CRT_ERROR | 복구불가한 치명적 에러 |
| _CRT_ASSERT | assertion 출력(assert() 출력이 아니다) |
| _CRTDBG_MODE_DEBUG | 디버그 윈도우 안에서 보게될 디버그 문자열에 출력을 전달 |
| _CRTDBG_MODE_FILE | output stream |
| _CRTDBG_MODE_WNDW | 메시지 박스 |
| _CRTDBG_REPORT_MODE | 현재의 리포트 모드를 리턴한다. |
~cpp _HFILE _CrtSetReportFile(int reportType, _HFILE reportFile);
| _CRTDBG_FILE_STDERR | 표준 에러 스트림으로 전달 |
| _CRTDBG_FILE_STDOUT | 표준 출력 스트림으로 전달 |
| _CRTDBG_REPORT_FILE | 현재의 목적지를 리턴한다. |