DCRT ¶
Debug C Runtime ν΄λμ€λ₯Ό μ΄μ©νλ©΄ λΌμ΄λΈλ¬λ¦¬κ° μμμ λμ ν λΉλλ λ©λͺ¨λ¦¬λ₯Ό μμΆμ νμ¬ λμλλ λ©λͺ¨λ¦¬λ₯Ό κ°λ νλ κ²μ΄ κ°λ₯νλ€.
μκΈ°κ° μ§ νλ‘κ·Έλ¨μΌλ‘ λλ €λ³΄κ³ λμ μ¬λΆλ₯Ό νλ¨νκΈ°μ μ’μ κ²μ΄λ€.
μκΈ°κ° μ§ νλ‘κ·Έλ¨μΌλ‘ λλ €λ³΄κ³ λμ μ¬λΆλ₯Ό νλ¨νκΈ°μ μ’μ κ²μ΄λ€.
~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()λ₯Ό νΈμΆ. λ©λͺ¨λ¦¬ ν΄μ μ μ€ν¨ν κ²½μ° κ·Έ μ 보λ₯Ό μ»μ μ μλ€. |
_CRTDBG_ALLOC_MEM_DF λ κΈ°λ³Έμ μΌλ‘ on, κΈ°ν νλκ·Έλ λν΄νΈ offμ΄λ―λ‘ bitwise μ°μ°μλ₯Ό μ΄μ©ν΄μ μ μ νκ² νλκ·Έλ₯Ό μ€μ ν΄μΌνλ€.
~cpp int flas = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); flag |= _CRTDBG_LEAK_CHECK_DF; // νλκ·Έ on flag &= !_CRTDBG_LEAK_CHECK_DF; // νλκ·Έ off _CrtSetDbgFlag(flag);
Code ¶
~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; }
MFCμμλ κΈ°λ³Έμ μΌλ‘ λ‘λνμ§λ§ μ½μμμλ μ¬μ©μκ° μ§μ μ§μ μ ν΄μ€μΌ λ‘λνλ€.
CRT κΈ°ν ν¨μ ¶
CRTμ κΈ°λ³Έ ν¨μλ€μ μΆλ ₯μ λλ²κ·Έ λ©μμ§ μλμ°μ΄λ€. μ΄λ₯Ό λ³κ²½νκΈ°μν΄μλ _CrtSetReportMode()λΌλ ν¨μλ₯Ό μ΄μ©ν΄μ μΆλ ₯μλν μΌλ° λͺ©μ μ§λ₯Ό μ§μ νκ³ , _CrtSetReportFile()λ₯Ό μ΄μ©ν΄μ νΉλ³ν μ€νΈλ¦Ό λͺ©μ μ§λ₯Ό μ€μ ν΄μΌνλ€.
~cpp int _CrtSetReportMode(int reportType, int reportMode);
reportType
_CRT_WARN | κ²½κ³ λ©μμ§ μ)memory leak |
_CRT_ERROR | 볡ꡬλΆκ°ν μΉλͺ μ μλ¬ |
_CRT_ASSERT | assertion μΆλ ₯(assert() μΆλ ₯μ΄ μλλ€) |
crtdbg.hλ ASSERT, ASSERTEλΌλ λ©ν¬λ‘ ν¨μλ₯Ό μμ±νλ€. λμ μ°¨μ΄μ μ ASSERTEλ assertion ννμ λ³΄κ³ νκ³ , λ€λ₯Έ κ²μ νμ§ μλ λ€λ κ²μ΄λ€.
reportMode_CRTDBG_MODE_DEBUG | λλ²κ·Έ μλμ° μμμ 보κ²λ λλ²κ·Έ λ¬Έμμ΄μ μΆλ ₯μ μ λ¬ |
_CRTDBG_MODE_FILE | output stream |
_CRTDBG_MODE_WNDW | λ©μμ§ λ°μ€ |
_CRTDBG_REPORT_MODE | νμ¬μ 리ν¬νΈ λͺ¨λλ₯Ό 리ν΄νλ€. |
λ€μ€ λͺ©μ μ§ μ§μ μ flag μ€μ κ³Ό λ§μ°¬κ°μ§λ‘ | μ°μ°μλ₯Ό ν΅ν΄μ κ°λ₯νλ€.
~cpp _HFILE _CrtSetReportFile(int reportType, _HFILE reportFile);
λλ²μ§Έ μΈμλ νμΌ μ€νΈλ¦Όμ _HFILE νμμ ν¬μΈν°μ΄κ±°λ λ€μμ μλ³μλ€ μ€μ νλμ΄λ€.
_CRTDBG_FILE_STDERR | νμ€ μλ¬ μ€νΈλ¦ΌμΌλ‘ μ λ¬ |
_CRTDBG_FILE_STDOUT | νμ€ μΆλ ₯ μ€νΈλ¦ΌμΌλ‘ μ λ¬ |
_CRTDBG_REPORT_FILE | νμ¬μ λͺ©μ μ§λ₯Ό 리ν΄νλ€. |
output in debug console (vc++6) ¶
after ¶
λμ²΄λ‘ ν΄λμ€μμμ λ©λͺ¨λ¦¬ μ μΆμ λμ λ©€λ² λ³μλ€μ΄ λ§λ€μ΄μ‘μ λ ν΄μΌνλ 'μΌμ λ²μΉ'μ μ§ν€μ§ μλλ°μ λΉλ‘―λλ κ²½μ°κ° λ§λ€.
λμ λ©€λ²λ³μλ₯Ό μ¬μ©νλ κ²½μ°μλ λμ
, ν λΉ μμ±μ, μλ©Έμλ₯Ό λ°λμ λ§λ€μ΄μΌνλ€.
μ°Έμ‘°) The rule of Three
μ°Έμ‘°) The rule of Three
after ¶
DCRTλ₯Ό μΌκ³ λλ κ²μ λ°λΌμ νλ‘κ·Έλ¨μ μνμλμ μ°¨μ΄κ° μλΉνλ€. STLλλ¬ΈμΈμ§λ λͺ¨λ₯΄κ² μ§λ§. - eternalbleu