c++之new(std::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) {...
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!