|  |  |
|
New/Delete 자세히 살펴보기
C++에서 메모리 관리 방식을 변경하려면
new
와
delete
연산을 중복 정의하면 된다. 클래스마다 메모리 정책을 달리 적용하려면 해당 클래스에서
new
와
delete
연산을 중복 정의한다. 프로그램 전체에 동일한 메모리 정책을 적용하려면 전역
new
와
delete
연산을 재정의한다. 연산을 중복 정의하는 방법은 두 가지다.
Listing 2
를 참조한다.
Listing 2. new/delete 연산 중복 정의
void* operator new(size_t size);
void operator delete(void* pointerToDelete);
-OR-
void* operator new(size_t size, MemoryManager& memMgr);
void operator delete(void* pointerToDelete, MemoryManager& memMgr);
|
위에 정의된
new
연산자는 첫 번째 인수로 넘어온 size만큼 메모리를 가공하지 않고 할당한다.
delete
연산은 인수로 넘어온 메모리를 해제한다. 여기서 각 연산은 메모리를 할당하거나 해제하는 작업만
수행한다. 생성자나 소멸자를 호출하지 않는다. 생성자는
new
연산이 메모리를 할당한 후에 호출되고, 소멸자는
delete
연산이 메모리를 해제하기 전에 호출된다.
아래에 정의된
메모리 지정(placement new)
연산자는 메모리를 할당해 주는 클래스인
MemoryManager
인수를 추가로 받는다.
MemoryManager가
할당한 메모리에 최종적으로 생성자가 호출된다. 이 튜토리얼에서는 첫 번째
new
/
delete
를 사용한다. 두 번째 new/delete를 사용하면 프로그램 코드 전체에
MemoryManager&
인수를 추가해야 하므로 ‘사용자 편의성’이라는 설계 목표에 어긋난다.
실제로 메모리를 할당하고 해제하는 작업은
MemoryManager
클래스가 모두 수행한다.
Listing 3
에서 보듯이,
new
/
delete
연산은 단순히 해당하는
MemoryManager
함수를 호출한다. 여기서 전역 변수 선언은 다음과 같다.
MemoryManager gMemoryManager; // Memory Manager,
global variable
.
Listing 3. new, new[], delete, delete[] 연산에서
MemoryManager 함수 호출
MemoryManager gMemoryManager; // Memory Manager, global variable
void* operator new (size_t size)
{
return gMemoryManager.allocate(size);
}
void* operator new[ ] (size_t size)
{
return gMemoryManager.allocate(size);
}
void operator delete (void* pointerToDelete)
{
gMemoryManager.free(pointerToDelete);
}
void operator delete[ ] (void* arrayToDelete)
{
gMemoryManager.free(arrayToDelete);
}
|
참고:
-
new[ ]
연산자에 전달되는 size 인수는 (배열 요소 수 * 각 요소 크기) 값이다.
-
클래스에 밀접한
new
,
delete
,
new[ ]
,
delete[ ]
연산자에서는 this 포인터를 사용하지 못한다. 즉 위 연산은 모두 정적 메서드다.
설계 시 항상 염두에 두어야 할 사항이다.
-
메모리 관리자를 전역 변수로 선언하는 대신 싱글톤(Singleton)을 사용해도 좋다.
이제 메모리 관리자 클래스의 기본적인 인터페이스를 정할 차례다.
Listing 4
를 참조한다.
Listing 4. 메모리 관리자 인터페이스
class IMemoryManager
{
public:
virtual void* allocate(size_t) = 0;
virtual void free(void*) = 0;
};
class MemoryManager : public IMemoryManager
{
public:
MemoryManager( );
virtual ~MemoryManager( );
virtual void* allocate(size_t);
virtual void free(void*);
};
|
성능 향상을 위해
allocate
와
free
함수는 인라인으로 선언할 계획이다.
|  |
|