반응형

http://blog.naver.com/mcblagg?Redirect=Log&logNo=10027082656


operator new란 무엇인가? 쉽게 말해서 객체를 생성하기는 하는데, 다른 요소는 몽땅 무시하고 메모리 공간만 그냥 잡아준다는 말이다. 물론 생성자도 호출되지 않는다.

 

선언방식은 매우 간단한다. 연산자 정의만 새로 해주면 끝.

void* operator new(size_t size); // size크기만큼 메모리를 잡아주고 메모리 포인터를 넘겨준다.

 

사용법은 더 간단하다. 스트링 객체를 생성해보자.

 

void* stringClass = operator new(sizeof(String));  // operator new를 이용한 메모리 공간 할당

void* stringClass = malloc(sizeof(String)); // malloc을 이용한 메모리 공간 할당

 

결국 두가지 방법 모두 똑같은 형태란 얘기다. 클래스 크기만큼의 공간만 할당해줬을뿐. 엄청 쉽다.

 

 

 

그렇다면 이젠 메모리지정 new, placement new 에 대해서 알아보면 되겠다.

 

우리가 위에서와 같이 그냥 메모리 공간만 할당해 놓았다면,

 다시 말해서 초기화가 되지 못한 메모리 상태라면,

 생성자를 호출해 버리고 싶은 욕구를 떨쳐내기 힘들 것이다. 크.. 당연한 얘기다.

 

그래서 필요한 게 메모리지정 new다 쉽게 말하자면 이미 잡혀있는 공간에 생성자를 불러준다는

뜻으로 생각하면 쉽겠다.  준비과정으로 무엇이 필요할까?

 

1. 잡아놓은 메모리공간

2. 생성자에서 필요로하는 매개변수들

 

이 두놈들만 있으면 준비는 끝이다. 이제 사용방법에 대해서 알아보자.

 

우선 operator new를 새로 정의해주자.

void* operator new(size_t, void* location) {

   return location;

}

위 정의에서 보면 알수 있듯이 인자로 받은 포인터를 고스란히 넘겨주도록만 정의해주면 끝이다.

 

그럼 실제로 적용해보자.

 

Book이라는 클래스가 있다고 가정하고, Book(string title)이 매개변수 생성자라고 하자.

 

ConstructBook(void* book, string title) {

   return new (book) Book(title);

}

 

이렇게 정의한 ConstructBook 함수가 바로 메모리 지정 함수다.

지정된 메모리(void* book)가 넘어오고 이 메모리에 생성자가 다시 호출되고 있다.

 

결과를 확인해보면 이 함수를 통해 공간만 할당되었던 book의 메모리에 인수로 받은 title이

새롭게 지정된 것을 확인할 수 있을 것이다.

 

정리를 해보자면.

 

1. new는 힙에 메모리를 할당함과 동시에 초기화를 해준다.

2. operator new는 힙에 메모리를 할당은 하지만 초기화는 해주지 않는다.

3. 메모리지정 new는 초기화 되지 않은 힙에 있는 메모리를 초기화 할 수 있게 해준다.

반응형

+ Recent posts