이유
1. 동적 메모리 할당시, 메모리가 되었을 때, 여러 이유로 오류가 날수 있다.
   이 오류에 대해서 대처하지 않으면 프로그램이 안정적이지 못하기 때문이다.
(참고)new연산자는 메모리 요구를 수행하지 못하면, 수행될때까지 루프를 돈다.


해결 방법
operator new가 요구된 메모리를 할당할 수 없을 때 new 핸들러 함수는 다음중 한가지를 실행시킨다.


1. 좀더 많은 메모리르 확보한다.
방법 : 프로그램 시작시 큰 메모리를 할당받게 한다. 그리고 new 핸들러가 호출되었을때, 이 미리 받은 메모리를 해체한다.
단점 : 가끔 메모리가 적거나 좀더 많은 메모리가 확보되지 않으면, 다음에 발생되는 new가 원할히 작동될수 없다.

2. 다른 new 핸들러를 설치한다.
방법 : set_new_handler를 호출하여 새로운 new 핸들러를 사용한다.
단점 : 설명되지 않음, 하지만, 새로운 new 핸들러와 기존 new 핸들러를 잘 관리해야 할꺼 같다.(이게 제일 좋을것 같다)

3. new 핸들러를 무용지물로 만든다.
방법 : 2번의 방법으로 널 포인터를 전달시킨다.
단점 : 기본 std::bad_alloc 을 사용 하기 때문에, 세부화된 설정을 할수 없다.

4. abort나 exit를 호출함으로써 리턴하지 않는다.
방법 : new 핸들러에 abort나 exit를 호출시키면 된다.
단점 : 단 1번의 메모리 할당 실패로 프로그램이 종료가 됨(절대로 쓰면 안된다고 생각 된다...)

해결 방법 요약 :
할당될 객체의 클래스에 예외처리
2번의 방법으로 내가 처리할것을 처리하고 bad_alloc을 호출하는게 좋다고 한다.
이럴 경우, set_new_handler에 대해서 템플릿 클래스를 만들어 쓰면 아주 유용하다고 설명한다.
(다중상속에 대해서는 끝에 설명하겠다고 한다. 머리속에는 set_new_handler를 이용해 세부 예외처리가 가능하다고 이해됨)


덧붙여
operator new 사용시, C++ 표준화 위원회는 제로 테스트 기반을 표준화했다.
이 제로 테스트는 실패시 0을 반환하는 동작을 유지시켜주는데 이런 형식을 (nothrow) 형식이라 부른다. 왜 nothrow이냐면, 이것은 예외(throw)를 던지지 않기 때문이다.

덧붙여 사용법
Widget *pw = new (notrow) Widget // 할당시 pw = 0이 된다.
이 방법도 숙제해두었다가 set_new_handler를 이용하여, 잘 사용 하라 한다(스위칭~)
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요