개발/C, C++

2_new2_예제

huiyu 2014. 7. 21. 01:21


예제)

메모리 해제가 제대로 되지 않은게 남았는지 자동으로 확인해주는 프로그램

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 표준이 제공해주는 매크로입니다.

728x90
반응형

'개발 > 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