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