STL源码剖析之_allocate函数

SGI STL提供的标准std::allocator中的_allocate函数代码如下:

template<class T>
inline T* _allocate(ptrdiff_t size,T*)
{
    set_new_handler(0);
    T* tmp=(T*)(operator new((size_t)(size*sizeof(T))));
    if(tmp==0)
    {
        cerr<<"out of memory"<<endl;
        exit(1);
    }
    return tmp;
}

现在的C++标准中,operator new的原型为: void* operator new(std::size_t size) throw(std::bad_alloc),在operator new分配内存失败的时候自动调用new_handler,如果new_handler为NULL,则抛出bad_alloc异常,既然抛出异常,那么代码中的if语句的处理就显得多余,岂不画蛇添足?

原来,在1993年之前的C++中,operator new的原型为: void* operator new(std::size_t size) throw(),分配失败时返回NULL,不抛出异常。所以这里是为了兼容过去的编译器才出现了if的处理,使之能适应新旧C++编译器。

原文地址:https://www.cnblogs.com/wwblog/p/3656879.html