鲜为人知的C++中关键字new的三种使用方式 (整理在此 方便学习)

来源:互联网 发布:add python to path 编辑:程序博客网 时间:2024/05/14 02:58
1.   普通new 也就是我们经常使用的new形式如下:int *p1=new int;       //   注意此处 不可以用指针是否为空判断分配空间是否成功  分配失败抛出异常//   现在很多C++程序员还以为是老样子 通过返回值判断是否分配成功 显然是错误的常用的方法,其对应的原函数为:void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)        {       // try to allocate size bytes        void *p;        while ((p = malloc(size)) == 0)                if (_callnewh(size) == 0)                {       // report no memory                static const std::bad_alloc nomem;                _RAISE(nomem);                }        return (p);        }其中:#define _THROW1(x) throw (...)#define _RAISE(x) throw xthrow (...)在函数声明中,表示函数中有抛出异常处理。 2. 不抛出异常new    失败时候返回的时NULL形式如下:int *p2=new(nothrow) int;  //  因此可以用指针是否为空判断分配空间是否成功不抛出异常的方法,其对应的原函数为:void * __CRTDECL operator new(size_t count, const std::nothrow_t&)_THROW0(){ // try to allocate count bytesvoid *p;_TRY_BEGINp = operator new(count);_CATCH_ALLp = 0;_CATCH_ENDreturn (p);}其中:#define _THROW0() throw ()#define _TRY_BEGIN try { #define _CATCH(x) } catch (x) { #define _CATCH_ALL } catch (...) { #define _CATCH_END }这个函数调用了p = operator new(count)这是1中所说的形式,也就是可能有异常,但是2方法的原函数对这个异常有了处理,所以从整个函数来看是没有抛出异常的,实际上是函数本身调用了常规的new函数,然后并对异常做了处理。throw ()在函数声明中,表示函数中不抛出异常处理。 3  置换new   这个new不会分配空间 只是重复使用已有的空间内存  来存储不同类型的对象  所以不用delete形式如下:int a;int *p3=new(&a) int;//3. 不申请新内存的方法,其原函数为:inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0(){ // construct array with placement at _Wherereturn (_Where);}直接把已有的内存地址返还给某个指针变量。_THROW0()表示函数中不抛出异常。