반응형
얼마전까지 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를 삽이해줘야 하는 번거로움이 있다.
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체크 코드까지) 하기 때문에 번거로움이 있다.
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체크 코드까지) 하기 때문에 번거로움이 있다.
반응형
'C and C++' 카테고리의 다른 글
[C++] 상속 팁 overide와 final 키워드 (0) | 2019.10.13 |
---|---|
[C++] 복사 생성자와 복사 대입연산자의 차이점 (2) | 2019.01.13 |
[C++] Template 템플릿에 대한 기본적인 이해 (0) | 2018.09.09 |
[C++] 상속에 대해 (0) | 2018.09.01 |
[C++] 상속받은 비가상 함수를 재정의(override)하면 안된다. (0) | 2018.08.19 |