본문 바로가기

책 스터디

[Exceptional C++ Style] 23. new와 예외, 2부 : 메모리 관리의 실질적인 문제들

이번 챕터에서는 new 할당 시도시 예외를 어떻게 보고하는 것이 바람직한가? 라는 질문과
new 할당 실패를 점검할 때에는 정말로 무엇을 점검해야 하는지, 그리고 과연 점검할 수 있느냐에 대한 이야기를 하고 있다.

책의 내용에 사실 새로울 만한 것이 없고, 평소 생각과 크게 다르지 않기에 요약만 정리하겠다.


메모리가 충분하지 않을 때 C++ 표준 new 함수들이 오류를 보고하는 주 된 형태 두 가지는?

1. std::bad_alloc을 던지는 방법

2. 예외를 던지지 않고, NULL을 리턴하는 방법 


핵심 요약

1. nothrow new를 가급적 피할 것.
    : new 할당이 실패할 정도면 사실 시스템이 제대로 동작하고 있다고 보기 힘들다.
    : 최대한 gracefully-closing을 할 수 있도록 스택 언와인딩이 조금 더 보장되는 예외 던지기 방식을 사용할 것을 추천한다.

2. new 실패를 점검한다는 것이 무의미한 경우가 있다.
    : 메모리가 고갈되었다는 데 무엇을 할 수 있겠는가?
    : 사전에 메모리 고갈 오류 보고를 위한 버퍼를 미리 할당해 놓았다면 모를까...

3. 메모리 고갈을 신경써야 하는 상황이라면, 무엇을 점검할 것인지 확실히 할 필요가 있다.

    1) 메모리가 쓰이기 전까지 커밋하지 않는 (게으른 커밋) 시스템에서는 일반적으로 new 점검이 무의미하다.

    2) 가상 메모리 시스템에서는 new 실패가 거의 또는 전혀 생기지 않는다. 
        왜냐하면 가상 메모리가 고갈되지 전에 시스템 자체가 매우 느려지게 되고, 
        그러면 시스템 관리자가 프로세스들을 죽이기 때문이다.

    3) 특별한 경우들을 제외할 때, new 실패를 검출했다고 해도, 정말로 메모리 고갈 상태라면 할 수 있는 일들이 거의 없다.


실제로 작업을 하다보면, 메모리 고갈로 인해 new 할당 실패를 겪는 일은 거의 없다.
(메모리가 줄줄 세서 메모리 고갈이 온다한 들 서버가 죽었으면 죽었지, new 할당 실패!!!가 딱 나온 적은 없는 거 같다)

잘못된 주소 영역에서 작업을 하고 있었다던지 하는 경우 아주 드물에 new 할당 실패를 겪을 수가 있긴 하더라.

결국, new에 대한 예외 처리는 이를 어떻게 보고하느냐가 중요한 것이 아니라, 
사전에 꼼꼼하게 작업하는 것이 더 중요한 포인트인 것을 명심해야 한다.