~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 | 현재의 목적지를 리턴한다. |