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


저번 항목까지는 언제 무엇을 위해 new 및 delete를 작성하는지 개념에 대해서 이야기 했지만, 이번 항목에선 어떻게 작성해야 하는지, 그 관례를 들어 설명해 주는 장이다.

new 의 관례
1. 메모리 할당이 0바이트라면 1바이트로 간주해야 한다.
2. 메모리 할당 작업은 "무한루프" 안에서 이루어 져야 한다.
- 이때 성공하거나 실패했을 때, 이 무한 루프 밖으로 나가야 한다.
- 실패 했을 경우, http://ikpil.com/572 처럼 new_handler 가 작동 되어야 한다.
3. 상속 관계에 놓을 때, BASE CLASS의 size가 아니라면 전역 operator new 를 호출하여 할당 받아 준다.

new[] 의 관례
1. 단순히 원시 메모리 덩어리만 할당 받는다.
그 이유는
1. 객체 하나가 얼마나 큰지 확정할 방법이 없기 때문이다.
2. operator new[] 에 넘어가는 size_t 타입의 인자는 객체들을 담는 공간의 size보다 더 클 수도 있기 때문이다.


delete 의 관례
1. NULL 해체시 작업을 하지 말것
- 즉 NULL 해체지 안전하도록 보장 할 것(프로그램 오동작으로 부터)
2. 상속 관계에 놓을 때, BASE CLASS의 size가 아니라면 전역 operator delete 를 호출하여 해체 한다.



여담으로..
가상 소멸자가 없는 BASE CLASS부터 파생된 DERIVED CLASS의 객체를 삭제할 경우 operator delete 의 size_t 값이 엉터리 일 수 있다. 그래서 꼭 파생 관계에 놓이면 꼭 소멸자는 virtual 로 해 두는것이 좋다.


이것만은 잊지 말자!
1. 관례적으로 operator new 함수는 메모리 할당을 반복해서 시도하는 무한 루프를 가져야 하고, 메모리 할당 요구를 만족시킬 수 없을 때 new-handler 를 호출해야 하고 0바이트에 대한 대책이 있어야 하며, 클래스 전용 버전일 경우 할당하기로 된 크기와 다를 경우에 대한 처리도 있어야 한다.
2. oeprator delete 의 경우 NULL 을 해체하는것에 대해서 안전성을 보장해야 하며, 클래스 전용의 경우 원래 해체하려고 하는 크기보다 다를 경우 전역 operator 를 호출하여 처리하도록 한다.

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

댓글을 달아 주세요