이유
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를 이용하여, 잘 사용 하라 한다(스위칭~)
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를 이용하여, 잘 사용 하라 한다(스위칭~)
'책 정리 > Effective C++ 2판' 카테고리의 다른 글
항목 11. 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라 (0) | 2008.05.07 |
---|---|
2부까지 종료 (0) | 2008.05.07 |
항목 10. operator new를 작성한다면 operator delete도 작성한다. (0) | 2008.05.07 |
항목 9. new의 "정상"형식을 감추지 않는다. (0) | 2008.05.07 |
항목 8. operator new와 operator delete 작성시 관례를 따른다. (0) | 2008.05.07 |
항목 6. 소멸자에서 포인터 맴버에 대해 delete를 이용 한다. (0) | 2008.05.07 |
항목 5. new와 delete의 사용시 동일한 형식을 이용한다. (0) | 2008.05.07 |
항목 4. C++ 스타일의 주석을 지향한다 (3) | 2008.05.07 |
항목 3. malloc과 free보다는 new와 delete를 사용한다. (0) | 2008.05.07 |
항목 2. <stdio.h> 보다는 <iostream>을 사용 한다. (0) | 2008.05.07 |
최근댓글