개발/C, C++

2_new3_nothrow

huiyu 2014. 7. 23. 02:42


#include <iostream> using namespace std; int main() { int* p = new int; // 실패시 std::bad_alloc 예외 발생 int* p2 = new(nothrow) int; // 실패시 0리턴 if ( p2 == 0 ) cout << "메모리 부족" << endl; else { // p사용후에 delete p; } }

 보통 new를 이용해서 메모리 할당시 실패를 하면 std:bad_alloc이라는 예외를 전달합니다.

그러나 예외 대신 0값을 리턴해주기 위해서 new(nothrow)를 이용하면 실패시 0값을 리턴하게 됩니다.


모든 new가 0을 리턴하고 싶을 때 상단부에 ,

#define new new(nothrow) 를 선언 후  사용합니다.


실제 nothrow를 예외로 던지는 new는 다음과 같이 되어있습니다.

#include <iostream> using namespace std; //보통의 new-메모리 할당 실패시 예외를 던진다 void* operator new( size_t sz) { void* p = malloc(sz); if ( p == 0 ) throw std::bad_alloc();    //메모리 할당 실패시 예외 return p; } struct nothrow_t{}; // sizeof(nothrow_t) => 1    //empty class nothrow_t nothrow; // 실패시 예외 대신 0을 리턴하는 버전 void* operator new( size_t sz, nothrow_t) { void* p = malloc(sz); return p; } int main() { int* p = new(nothrow) int; }

 nothrow는 아무 요소도 없는 클래스(구조체)로 empty class라고 합니다. 실제로 사용하지 않고 단지 함수 오버로딩이나 template인자로 사용하기 위해 만드는 구조체로, 위 예제에서 0값을 리턴해주는 new를 위한 함수 오버로딩으로 이용하였습니다.


728x90
반응형

'개발 > C, C++' 카테고리의 다른 글

2_new_정리  (0) 2014.07.23
2_new4_Placement new  (0) 2014.07.23
2_new2_예제  (0) 2014.07.21
2_new1_new,operator new, operator delete  (0) 2014.07.20
1_this4_다중 상속의 멤버함수 포인터  (0) 2014.07.20