본문 바로가기

Dev/C++

new 2

new의 실패 #

new 키워드의 메모리 할당은 operator new 함수에 의해 처리가 됩니다.

이 operator new 함수의 실패는 ISO C++표준 이전에는 NULL을 리턴하게 되었으나 ISO C++표준에서는 std::bad_alloc 객체를 예외로 발생 시키는 것으로 결정 되었습니다.

#include <stdexcept>
#include <iostream>
using namespace std;

int main()
{
        try {
                // 실패한다면 std::bad_alloc 예외 발생 
                int *p = new int[10000000];

                // 구식 컴파일러라면 이 조건에 .. 
                if (!p) {
                        cout << "bad alloc error : old version " << endl;
                        return -1;
                }
        }
       catch (std::bad_alloc &e) {
                cout << "bad alloc error " << endl;
        }
        catch (...) {
                cout << "unknown error " << endl;
        }
}
표준은 준수하는 컴파일러라면 exception(catch (std::bad_alloc &e))이 발생 할것이고 아니라면 if (!p) 조건에 해당되어 처리가 될것입니다.




예외없는 new #

위에서 언급했듯이 표준 이전의 스펙에서만 실패했을때 예외를 발생 시키지 않고 NULL을 리턴 하게 됩니다.

그러나 상황에 따라서는 실패시 NULL을 리턴하는 동작이 필요 할수도 있습니다.
혹은 예외의 비용이 부담되서, 혹은 예외가 지원되지 않아서 등등..

그래서 ISO C++ 표준에서는 예외를 발생시키지 않는 operator new 함수를 추가 했습니다.
void* operator new(std::size_t size, const std::nothrow_t&) throw();
void* operator new[](std::size_t size, const std::nothrow_t&) throw();
일반 operator new 함수에 2번째 인자 const std::nothrow_t& 가 추가가 된 형태 입니다.

#include <new>
#include <stdexcept>
#include <iostream>
using namespace std;

int main()
{
        try {
                int *p = new(nothrow) int[10000000];
                if (!p) {
                        cout << "bad alloc error : old version " << endl;
                        return -1;
                }
        }
        catch (std::bad_alloc &e) {
                cout << "bad alloc error " << endl;
        }
        catch (...) {
                cout << "unknown error " << endl;
        }
}
위의 코드에서는 예외를 발생 시키지 않고 실패시 NULL을 리턴하게 될것입니다.

'Dev > C++' 카테고리의 다른 글

상속되지 않는것  (0) 2008.05.01
STL  (0) 2008.05.01
new 2  (0) 2008.05.01
new 1  (0) 2008.05.01
initialization - array structure  (0) 2008.05.01
operator overloading 2  (0) 2008.05.01

태그