STL源码剖析之_allocate函数
2014-04-10 16:57 微尘_无名 阅读(748) 评论(0) 编辑 收藏 举报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++编译器。