항목49 - new와 delete를 내 맘대로

Bogoomi·2022년 7월 24일
0

EffectiveC++

목록 보기
23/24

항목49 - new와 delete를 내 맘대로



요약
예전에는 new연산을 통해 메모리를 할당하면서 메모리 할당을 못하게 되었을 때, NULL을 반환했지만, 지금은 사용자가 처리자(new-handler)를 통해 예외처리를 할 수 있다.

프로그램 구현에 좋은 방향으로 new를 사용하는 방법

  • 충분히 많은 메모리를 구비해둔다.
  • 다른 new 처리자를 설치한다(현재의 new 처리자 안에서 set_new_handler를 호출 or new처리자가 자기 자신의 동작 원리를 변경하도록 만듦).
  • new 처리자를 제거하여 컴파일러가 예외 처리하도록 만든다.
  • bad_alloc에서 파생된 타입의 예외를 던진다.
  • abort, exit를 호출한다.

new 처리자 사용방법 예시코드

void outOfMem();			// Widget 객체에 대한 메모리 할당 실패했을 때 호출되는 함수 선언.
Widget::set_new_handler(outOfMem);	// Widget의 new 처리자 함수로서 outOfMem을 설치.
Widget * pw1 = new Widget;		// 메모리 할당이 실패하면 outOfMem이 실행
Widget::set_new_handler(0);		// null값으로 초기화(new처리자가 아무것도 할 수 없음)
Widget * pw2 = new Widget;		// 메모리 할당이 실패하면 이제는 예외를 던진다.

new처리자를 사용하는 클래스를 template으로 바꾸면 좀 더 많은 타입을 수용할 수 있다.

new_handler를 구현하여 new에 대한 예외처리를 했다면, '예외불가(nothrow)' 라는 형태도 있다.

예외불가 형태 예시코드

class Widget { . . . };
Widget *pw1 = new Widget;

if(pw1 == 0) . . .

Widget *pw2 = new (std::nothrow)Widget;	// Widget을 할당하다 실패하면 0을 반환.

if(pw2 == 0) . . .



잊지말자!

  • set_new_handler 함수를 쓰면 메모리 할당 요청이 만족되지 못했을 때 호출되는 함수 만들 수 있음
  • 예외불가(nothrow) new는 영향력이 제한되어 있음. 메모리 할당 자체에만 적용. 이후 호출되는 생성자에서는 얼마든지 예외 던질 수 있음
profile
개에에에바알

0개의 댓글