내가 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 : 영어도 못하면서 코드만 보면서 이해 한다.. ... 확실히 살아가는데 영어는 필요가 없었다. 하지만 프로그래머로써 영어는 필요 하다. ㅠ_ㅠ
이번 항목은 위치지정이라는 재미있는 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 : 영어도 못하면서 코드만 보면서 이해 한다.. ... 확실히 살아가는데 영어는 필요가 없었다. 하지만 프로그래머로써 영어는 필요 하다. ㅠ_ㅠ
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
드디어 다 읽었다. (2) | 2008.08.12 |
---|---|
항목 55: Boost! 부스트를 늘 여러분 가까이에 (0) | 2008.08.11 |
항목 54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자 (0) | 2008.08.11 |
항목 53: 컴파일러 경고를 지나치지 말자 (0) | 2008.08.11 |
항목 51: new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자. (0) | 2008.08.09 |
항목 50: new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자 (0) | 2008.08.07 |
항목 49: new 처리자의 동작 원리를 제대로 이해하자. (0) | 2008.08.07 |
항목 48: 템플릿 메타프로그래밍, 하지 않겠는가? (1) | 2008.08.05 |
항목 47: 타입에 대한 정보가 필요하다면 특성정보 클래스를 사용하자. (0) | 2008.08.05 |
항목 46: 타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 (0) | 2008.08.03 |
최근댓글