내가 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 를 호출하여 처리하도록 한다.
저번 항목까지는 언제 무엇을 위해 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 를 호출하여 처리하도록 한다.
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
드디어 다 읽었다. (2) | 2008.08.12 |
---|---|
항목 55: Boost! 부스트를 늘 여러분 가까이에 (0) | 2008.08.11 |
항목 54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자 (0) | 2008.08.11 |
항목 53: 컴파일러 경고를 지나치지 말자 (0) | 2008.08.11 |
항목 52: 위치지정 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 |
최근댓글