51) new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아두자
operator new는 다음과 같은 요구사항을 만족해야 한다.
- 반환 값이 제대로 되어있어야 함
- 가용 메모리가 부족할 경우에는 new 처리자 함수를 호출해야 한다
- 크기가 없는 메모리 요청에 대한 대비책을 갖춰두어야 한다.
- 기본 형태의 new가 가려지면 안된다.
위 조건을 만족하는 operator new를 의사 코드로 만들면 다음과 같다.
void * operator new(std::size_t size) throw(std::bad_alloc)
{
using namespace std;
if (size==0) {
size = 1;
}
while(true){
size 바이트 할당
if(할당 성공시)
return 할당된 메모리에 대한 포인터
// 할당실패시 현대 new 처리자 함수를 찾아냄
new_handler globalHandler = set_new_handler(0);
set_new_handler(globalHandler);
if(globalHandler) (*globalHandler)();
else throw std::bad_alloc();
}
}
operator delete는 널 포인터가 입력으로 들어올 경우에 아무것도 안하는 처리가 필요하다.
52) 위치 지정 new 작성 시 위치 지정 delete도 작성하자
추가적인 매개변수를 취하는 operator new 함수가 있는데 그것과 똑같은 추가 매개변수를 받는 operator delete가 짝으로 존재하지 않으면, 이 new에 해당 매개변수를 넘겨서 할당한 메모리를 해제해야하는 상황이 오더라도 어떤 operator delete도 호출되지 않는다.
따라서 operator new의 위치 지정(placement) 버전을 만들 때에는 짝을 이루는 operator delete도 반드시 작성해야 한다.
또한 두 operator의 위치 지정 버전을 선언할 때에는 표준이 가려지지 않도록 주의해야 한다.
9. 그 밖의 것들
53) 컴파일러 경고를 지나치지 말자
컴파일러 경고가 알려주고자 한 것이 뭘까를 생각하고, 컴파일이 된다고 지나치지 말자.
54) TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자
1차 기술 보고서의 줄임말이다.
책에 수록된 내용은 최신 tr1과는 거리가 있어서 구체적으로 쓰지 않음
55) boost와 친구가 되자
boost는 Tr1의 기능을 구현한 범용 라이브러리로 C++ 표준화에 큰 영향력을 미치는 오픈소스 라이브러리 개발 모임이다. Tr1뿐만 아니라 좋은게 많다.
반응형
'C++ > Effective C++' 카테고리의 다른 글
Effective C++ (46) ~ (50) (0) | 2021.08.28 |
---|---|
Effective C++ (41) ~ (45) (0) | 2021.08.26 |
Effective C++ (36) ~ (40) (0) | 2021.08.25 |
Effective C++ (31) ~ (35) (0) | 2021.08.24 |
Effective C++ (26) ~ (30) (0) | 2021.08.22 |
댓글