예제)
메모리 해제가 제대로 되지 않은게 남았는지 자동으로 확인해주는 프로그램
Operator new와 Operator delete 재정의 이용,
int count = 0; //메모리 할당해준 객체 카운트 세는 변수
//할당한 객체의 파일명, 몇번째 라인인지, 주소, 크기를 저장 struct BLOCK { char file[256]; int line; void* addr; int size; }; BLOCK mem[10000]; // 할당한 메모리 정보를 관리할 배열 //operator new, operator delete 재정의 void* operator new( size_t sz, char* file, int line) { void* p = malloc(sz); strcpy(mem[count].file, file); mem[count].line = line; mem[count].addr = p; mem[count].size = sz; ++count; return p; } void operator delete(void* p) { // 배열에 기록된 정보를 제거한다. for ( int i = 0; i < count;i++) { if ( mem[i].addr == p ) { mem[i] = mem[count-1]; // i번째 제거 --count; free(p); break; } } }
Operator new()를 재정의 해 new를 할 때마다 mem배열을 이용해 정보를 추가한다.
Operator delete()역시 재정의 하여, mem배열에서 해제해준 메모리의 정보를 없앤다.
다음과 같이 __check 클래스를 생성 후 전역 변수로 선언해 준다.
class __check { public: ~__check() { if ( count == 0 ) cout << "No Memory Leak" << endl; else { cout << count << "개의 메모리 누수가 있습니다." << endl; for ( int i = 0; i < count; i++) { printf("%s(%d) : %p, %d bytes\n", mem[i].file, mem[i].line, mem[i].addr, mem[i].size); } } } }; __check _c;
전역 변수의 경우,
1. Main함수 종료후 뭔가를 실행하고 싶을 때 사용,
2. 전역변수의 소멸자를 이용, 이는 main함수 종료 후 실행된다.
count 변수를 이용하여 메모리 해제가 제대로 되지 않은 변수의 갯수를 확인한 후, mem배열을 이용 하여 그 정보를 출력한다.
다음과 같은 메인함수를 실행하면,
#define new new(__FILE__, __LINE__) int main() { int* p1 = new int; int* p2 = new int; int* p3 = new int; }
어디에서 메모리 누수가 났는지 확인할 수 있다.
* __FILE__, __LINE__은 C 표준이 제공해주는 매크로입니다.
'Software Development > C, C++' 카테고리의 다른 글
2_new4_Placement new (0) | 2014.07.23 |
---|---|
2_new3_nothrow (0) | 2014.07.23 |
2_new1_new,operator new, operator delete (0) | 2014.07.20 |
1_this4_다중 상속의 멤버함수 포인터 (0) | 2014.07.20 |
1_this3_멤버 변수의 포인터 (0) | 2014.07.20 |