Visual C++ Debugging: memory leak 어떻게 관리할 것인가? Q: memory leak 이란 무엇인가?
Code: void foo() { int *i = new int; *i = 44; }
Code: { char* str = new char[20]; strcpy(str,"memory leak"); }
Code: class Sample { int* val; public: Sample() { val = new int; *val = 44; } ~Sample() { delete val; } }; void foo() { Sample* a = new Sample; Sample* b = new Sample; a = b; delete a; // 이때 b도 사실상 삭제되었다. //delete b; // 이미 삭제됨.
Code: double* d = new double[10]; delete d; // delete d[0]; // must use delete [] d;
Code: int *i; while(someCondition) { i = new int; // some code } delete i;
Code: Detected memory leaks! Dumping objects -> D:\VisualC++\CodeGuru\MemoryLeak\MemoryLeak.cpp(67) : {60} normal block at 0x00324818, 4 bytes long. Data: <, > 2C 00 00 00 Object dump complete.
Code: Detected memory leaks! Dumping objects -> {60} normal block at 0x00324818, 4 bytes long. Data: <, > 2C 00 00 00 Object dump complete.
'_CRTDBG_MAP_ALLOC'를 정의 하면, memory가 leak되는 곳의 file까지 보여준다. 파일이름에 추가로 따라오는 번호는 file 내부에 있는 line 번호이다. C++의 ‘new’와 ‘delete’에서 '_CRTDBG_MAP_ALLOC'를 사용했을때의 효과는 무엇인가? A: application에서 debug모드로 '_CRTDBG_MAP_ALLOC' flag를 정의 하면, heap function들의 기본 버전은 debug모드로 mapping된다. 이 flag는 '_DEBUG' flag가 정의되어 있을때만 사용 가능하다. 만약 '_CLIENT_BLOCK' 할당 형태로 사용하길 원한다면, 'CRTDBG_MAP_ALLOC'를 define 하지 마라. 대신에, 'net'의 Debug버전을 직접 호출하거나, 아래의 예에서 처럼 debug 모드에서의 'new'를 대치 할수 있는 macro를 만들어 써야 한다. 'delete'의 debug버전은 보든 block type들에서 동작하고 release 버전에서도 program의 수정이 필요하지 않다. // DbgNew.h // Defines global operator new to allocate from client blocks #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_CLIENTBLOCK #endif // MyApp.cpp // Compile options needed: /Zi /D_DEBUG /MLd or use a // Default Workspace for a Console Application to build a debug version #include <crtdbg.h> #include <dbgnew.h> #ifdef _DEBUG #define new DEBUG_CLIENTBLOCK #endif int main( ) { int* array = new int[10]; _CrtMemDumpAllObjectsSince(NULL); return 0; }
typedef struct _CrtMemState { struct _CrtMemBlockHeader* pBlockHeader;//최근 할당된 block을 위한 pointer unsigned long lSizes[_MAX_BLOCKS]; //할당된 각각의 block type들의 총 byte } _CrtMemState;
아래의 function들은 heap의 상태와 내용을 기록하고 memory leak과 다른 문제들을 감지하기 위해 정보들을 이용한다.
Code: _CrtMemState s1, s2, s3; _CrtMemCheckpoint( &s1 ); // memory allocations take place here _CrtMemCheckpoint( &s2 ); if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 );
Code: #include <iostream> #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> int main() { int* array = new int[10]; _CrtDumpMemoryLeaks(); return 0; }
Code: #ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif // Do your memory allocations and deallocations. CSite* p = new CSite( "CodeGuru", "http://www.codeguru.com"); #ifdef _DEBUG newMemState.Checkpoint(); if( diffMemState.Difference( oldMemState, newMemState ) ) { TRACE( "Memory leaked!\n" ); } #endif
| ||||
(1) 각도의 기본 단위
각도를 나타내는 단위입니다. 360분법 으로 표시하는 1도는 사방을 360으로 나눈 크기입니다. 1분은 1도를 60등분한 각이고 1초는 1분을 다시 60등분한 크기입니다. 분(arcminute)과 초(arcsecond)는 시간을 나타내는 단위인 분(minute), 초(second)와 기호가 같은데, 천문학(영어)에서는 둘을 구분하기 위해 각도는 나타내는 단위에는 ' arc- '를 붙여 표기합니다.
각도를 나타내는 다른 방법으로 호도법 이 있습니다. 호도법은 반지름에 대한 호의 길이 단위로 각도를 표시하는 방법으로 사방은 원주율(π)의 2배 크기가 됩니다(360° = 2π rad). 호도법으로 나타낸 각도는 라디안(radian)으로 표시하며, 360분법으로 나타낸 각도를 호도법으로 나타낸 각도로 바꾸어 주려면 360분법으로 나타낸 각도에 π/180을 곱해주면 됩니다. 컴퓨터 프로그램 언어에서 삼각함수를 계산할 때에는 주로 호도법은 쓰고 있습니다.
1도(˚ , degree) : 1˚ = 60′ = 3600″ = π/180 rad
1분(′, arcminute) : 1′ = 60″ = 1/60°
1초(″, arcsecond) : 1″ = 1/60′ = 1/3600°
1라디안(rad, radian) : 1 rad = 180/π° (π = 원주율 = 3.1415926535897932384626433832795)
(2) 시간의 기본 단위
시간의 기본단위는 초(second)입니다. 1초는 국제 표준으로 정밀하게 정의되어 있는데, 세슘 원자(세슘-133)가 9,192,631,770번 진동하는 동안의 시간으로 정의되어 있습니다. 본래 1초는 1 평균 태양일의 1/86400로 정의되어 있었지만 지구의 자전 주기는 다소 불규칙하고 느리게 바뀌고 있으므로 균일한 시간을 정의하기에는 부족합니다. 이후 1초는 지구의 공전 주기를 바탕으로 다시 정의 되었다가 지금은 세슘 원자의 특성을 기반으로 새롭게 정의하여 ...
댓글
댓글 쓰기