operatore new 함수는 예외를 던지게 되어 잇습니다.
메모리 할당이 제대로 되지 못한 상황에 대한 반응으로 operator new가 예외를 던지기 전에, 이 함수는 사용자 쪽에서 지정할 수 있는 에러 처리 함수를 우선적으로 호출하도록 되어 있는데, 이 에러 처리 함수를 가리켜 new 처리자라고 합니다.
set_new_handler는 new_handler를 받고 new_handler를 반환하는 함수입니다.
즉, set_new_handler가 받아들이는 new_handler 타입의 매개변수는 요구된 메모리를 operator new가 할당하지 못했을 때 operator new가 호출할 함수의 포인터입니다.
new 처리자 함수가 다음 동작 중 하나를 꼭 해주어야함.
- 사용할 수 있는 메모리를 더 많이 확보
- 다른 new 처리자를 설치
- new 처리자의 설치를 제거
- 예외를 던집니다.
- 복귀하지 않습니다.
할당 실패 시, 널 반환 동작 형태 대안적인 형태가 예외불가(nothrow) 형태
class Widget {...};
Widget *pw1 = new Widget; // 할당 실패 시, bad_alloc 예외를 던짐.
if(pw1 == 0) ... // 이 점검 코드는 실패합니다.
Widget *pw2 = new (std::nothrow) Widget; // Widget을 할당하다 실패하면, 0을 반환
if(pw2 == 0) ... // 이 점검 코드는 성공할 수 있다.
해당 내용처럼 할당이 실패하면 operator new는 널포인터를 반환
그러나, 할당 성공하면 생성자를 호출하는 데, 생성자 내부에서 예외가 나오지 않게 막아 준다는 보장이 없음.
정리:
- set_new_handler 함수를 쓰면 메모리 할당 요청이 만족되지 못했을 때 호출되는 함수를 지정할 수 있습니다.
- 예외불가(nothrow) new는 영향력이 제한되어 있습니다. 메모리 할당 자체에만 적용되기 때문입니다. 이후에 호출되는 생성자에서는 얼마든지 예뢰를 던질 수 있습니다.
'서적 > Effective C++' 카테고리의 다른 글
항목 51: new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자 (0) | 2022.07.26 |
---|---|
항목 36: 상속 받은 비가상 함수를 파생 클래스에서 재정의하는 것은 금물! (0) | 2022.04.07 |
항목 35: 가상함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 (0) | 2022.04.07 |
항목 34: 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 (0) | 2022.04.07 |
항목 33: 상속된 이름을 숨기는 일은 피하자 (0) | 2022.04.07 |