C and C++

[C++] new 연산자 예외처리

개발새발 2018. 12. 2. 23:10
반응형

얼마전까지 c++로 개발 할 때 new연산에 대한 예외처리는 생각해보지 않고 개발했었다. 

내공이 매우 부족하여 막연하게 프로그램 내에서 설마 new를 할 때 예외가 발생하겠어? 라는 생각을 가지고 있었다. 

그러나 실무에서는 비일비재 한 일이였다. c++에서 new연산자에 대한 예외처리는 세가지이다.


      1. try catch를 통한 예외 처리
      try {
      int *arr = new int[100000000];
      }
      catch (std::bad_alloc &exception) {
      cout << "exception :" << exception.what() << endl;
      std::abort();
      } 간단한 방법이긴 하나 new연산자를 사용할 때 마다 try catch를 삽이해줘야 하는 번거로움이 있다.

      2 .std:set_new_handler에 콜백함수를 등록해서 처리
      C++ 표준 라이브러리에 서는 set_new_handler 함수를 제공한다. 파라미터가 없고 void를 리턴하는 함수포인터를 인자로 받는다.

      void handler() {
      cout << "out of mem" << endl;
      std::abort();
      }
      int main(void) {
      std::set_new_handler(handler);
      while (true) {
      int *arr = new int[100000000];
      }
      return 0;
      }

      3. std::nothrow를 통해 메모리 할당 실패시 NULL 리턴
      int main(void) {
      while (true) {
      int *arr = new(std::nothrow) int[100000000];
      if (arr == NULL) {
      cout << "NULL return" << endl;
      std::abort();
      }
      }
      return 0;
      } C언어에서 malloc이나 calloc의 경우 메모리 할당 실패시 NULL을 러턴하고 90년대 버전의 C++의 new연산자 역시 메모리 할당 실패시 NULL을 리턴했다. 그러나 현재는 더이상 NULL을 리턴하지 않고 예외를 발생시킨다. 따라서 nothrow없이 if(arr==NULL)을 통해 NULL체크를 하는 코드는 무의미한 코드라고 할 수 있다. 따라서 NULL 체크를 통해 메모리 할당 실패를 확인하기 위해서는 nothrow를 사용하면 된다. 그러나 이방법도 new연산을 사용할 때마다 항상 삽입해줘야(+ NULL체크 코드까지) 하기 때문에 번거로움이 있다.


반응형