내가 C++에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve C++ 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다.  - 최익필

이번 항목은 위치지정이라는 재미있는 operator new 를 정의해야 할 때, 조심해야 할 점에 대한 이여기가 주가 된다.

우선 위치지정(placement) operator new 라는것이 생소하게 들릴수 있어도, 크게 무리 없이 이해가 되는 operator new 이다. 이 operator new로 말할것 같으면, 내가 원하는 공간에 메모리를 할당 받을 수 있게 해준다. 원조는 STL vector 에서 쓰였다고 한다.

이런 위치지정(placement) operator new가 더 확장되어서, 메모리 주소 말고도 다른 매개변수를 갖는 것을 위치지정(placement) operator new 라고 불려온다.

알다시피 operator new 를 이용한다면, 메모리 할당 후 생성자가 할당된 메모리 공간에서 호출 되어 씌워진다.

곰곰히 생각해 보면, 만약 할당 한 다음 생성자 호출 단계에서 예외가 발생하면, 할당 공간의 메모리는 어떻게 될까?
delete를 호출해 주어야 할 것 같은데, 사용자는 delete를 호출하지 않아도 된다. 왜냐하면 런타임 시스템님께서 알아서 operator new 와 짝이 맞는 operator delete 를 호출해 주기 때문이다.

런타임 시스템님께서는 이 operator new 와 operator delete를 짝으로 기억을 해 두는데, 두 연산자의 매개변수가 같은것으로 그 짝을 찾아서 기억한다.

그렇기 때문에, 위치지정(placement) operator new 를 정의했다면, 여기에 맞는 위치지정(placement) operator delete 도 함께 정의 해 두어야 한다.


이것만은 잊지 말자!
1. operator new 함수의 위치지정(placement) 버전을 만들 때는, 이 함수와 짝을 이루는 operator delete 도 같이 만들어야 한다.
2. new 및 delete 의 위치지정 버전을 선언 할 때는, 표준 버전이 가리지 않도록 해야 한다.


관련링크
http://natsu.springnote.com/pages/1365016
http://kldp.org/node/89303
http://webdizen.new21.net/blog/entry/C-핵심정리-메모리관리-2
http://lwittgen.tistory.com/14
http://www.glenmccl.com/nd_cmp.htm
http://www.daniweb.com/forums/thread75705.html : palcement new 에 대한 개념이해에 도움됨
http://kldp.org/node/76375

p.s : 영어도 못하면서 코드만 보면서 이해 한다.. ... 확실히 살아가는데 영어는 필요가 없었다. 하지만 프로그래머로써 영어는 필요 하다. ㅠ_ㅠ

신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요