박오이님
무미건조한 개발자
박오이님
전체 방문자
오늘
어제
  • 뭥미 (101)
    • 프로젝트 (8)
      • 자가 보호 (3)
      • 주식 시장 분석 도구 (5)
    • 보안 (7)
      • 개론 (2)
      • 웹 (2)
      • 시스템 (2)
    • 개발 (69)
      • C++ (12)
      • Win32 (7)
      • MFC (2)
      • 자료구조 (8)
      • 알고리즘 (22)
      • 백준 (9)
      • 프로그래머스 (4)
      • LeetCode (0)
      • 개발자 면접 준비 (4)
      • OpenGL (1)
    • 서적 (13)
      • Effective C++ (9)
      • Effective Modern C++ (4)
    • 관심사 (4)
      • 재테크 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 에라토스테네스의 체 #C #C++ #개발 #알고리즘 #BFS #DFS #백준 #백준알고리즘
  • 나동빈
  • C++
  • 윈도우
  • 알고리즘
  • vcpkg
  • 윈도우프로그래밍
  • 코딩컨벤션
  • std
  • 최소간선비용
  • 시스템프로그래밍
  • Functional
  • 백준 #알고리즘 #플로이드와샬 #DFS #BFS #C #C++
  • 나동빈 #알고리즘 #동빈나
  • 크루스칼알고리즘
  • CPP
  • 윈도우시스템프로그래밍
  • 안경잡이개발자
  • 동빈나
  • 에라토스테네스의 체 #알고리즘 #개발 #C #C++ #소수 #소수판별
  • 합집합찾기
  • 프로세스메모리
  • JSON
  • DFS #BFS #알고리즘 #프로그래밍 #코딩테스트 #코딩 #C++ #C
  • C
  • 개발
  • 플로이드와샬알고리즘 #최단경로 #백준 #알고리즘 #개발 #C #C++
  • 윈도우개발자
  • EffectiveC++
  • jsoncpp

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
박오이님

무미건조한 개발자

서적/Effective C++

항목 49: new 처리자의 동작 원리를 제대로 이해하자

2022. 7. 18. 01:48

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
    '서적/Effective C++' 카테고리의 다른 글
    • 항목 51: new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자
    • 항목 36: 상속 받은 비가상 함수를 파생 클래스에서 재정의하는 것은 금물!
    • 항목 35: 가상함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자
    • 항목 34: 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자
    박오이님
    박오이님
    긍정도 아니고 부정도 아닌 0

    티스토리툴바