c++之new(std::nothrow)的作用

文章解析了OpenDDS源码中的ACE_new宏,它在内存分配失败时不中断程序,而是返回NULL。作者还介绍了new和nothrow的用法,以及newtype[](nothrow)的创建数组对象的特性。


在阅读opendds的源码时,看到这样一个宏,感觉很奇怪:

#    define ACE_NEW(POINTER,CONSTRUCTOR) \
   do { POINTER = new(ACE_nothrow) CONSTRUCTOR; \
     if (POINTER == 0) { errno = ENOMEM; return; } \
   } while (0)

其中宏的ACE_nothrow定义:

#    define ACE_nothrow   ::std::nothrow

调用宏的位置:

    ACE_NEW (this->temp_,
             const CHAR_TYPE *[this->total_size_]);

看到这里没看明白,因为我们一般使用new创建对象时经常使用,最常用的方式如下:

class A{
....
}

A* p = new A;

头一次看到这样的使用方法,,不知道这是啥意思:

new(std::nothrow) type

后来通过查阅得知,这个new(std::nothrow)这样的使用的含义是:

正常new创建内存,如果对象创建失败,则会返回错误,程序会中断,不会执行new后面的语句;而new(std::nothrow)则不会中断程序,反而会将指针设置为NULL;

class A{
.....
}

A* p = new A;
if(p == NULL) //如果new失败,if语句不会执行
{
...
}


A* p = new(std::nothrow) A;
if(p == NULL) //如果new失败,p对象会被设置为NULL,if语句会被执行
{
...
}

 到这里也就明白了,opendds中这句话的含义:

创建一个指向const CHAR_TYPE *[this->total_size_]类型的指针的指针,返回的是一个二级指针。该指针指向一个数组对象,且该数组的长度是total_size_。同时对象创建失败是,将对象设置为NULL,不会中断程序。

总结

new的用法总结:

  • new type():这是最普通的用法,这也是大家都能看懂的用法.,此种用法用于创建type类型的对象,例如type* p = new type;
  • new type[n]:创建一个数组对象,每个数组元素的类型都是type,例如type* p = new type[n];
  • new type*[n]:创建一个指向数组对象的指针,这样返回的是一个二级指针,例如type** p= new type*[n];
  • new (std::nothrow) type:内存申请失败,不报错,并返回NULL,建议在c++中使用new时配合(std::nothrow使用),如下所示

A* p = new (std::nothrow) ClassA();

//这样使用if语句会被执行,否则if语句不会执行
if (NULL == p) {

...
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值