IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  AIX와 UNIX | 리눅스  >

C/C++ 프로젝트에 사용할 메모리 관리자 직접 구현하기 (한글)

developerWorks
Go to the previous page15 페이지 중 6 페이지Go to the next page

문서 옵션

샘플 코드


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


New/Delete 자세히 살펴보기

C++에서 메모리 관리 방식을 변경하려면 newdelete 연산을 중복 정의하면 된다. 클래스마다 메모리 정책을 달리 적용하려면 해당 클래스에서 newdelete 연산을 중복 정의한다. 프로그램 전체에 동일한 메모리 정책을 적용하려면 전역 newdelete 연산을 재정의한다. 연산을 중복 정의하는 방법은 두 가지다. 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*);
  };  
				

성능 향상을 위해 allocatefree 함수는 인라인으로 선언할 계획이다.




위로



Go to the previous page15 페이지 중 6 페이지Go to the next page
    IBM 소개 개인정보 보호정책 문의