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

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 x

throw (...)在函数声明中,表示函数中有抛出异常处理。


 2. 不抛出异常new    失败时候返回的时NULL


形式如下:

int *p2=new(nothrow) int;  //  因此可以用指针是否为空判断分配空间是否成功

不抛出异常的方法,其对应的原函数为:

void * __CRTDECL operator new(size_t count, const std::nothrow_t&)

_THROW0()

{ // try to allocate count bytes

void *p;

_TRY_BEGIN

p = operator new(count);

_CATCH_ALL

p = 0;

_CATCH_END

return (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 _Where

return (_Where);

}

直接把已有的内存地址返还给某个指针变量。_THROW0()表示函数中不抛出异常。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值