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

2023-12-13 06:28:32


在阅读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) {

...
}

文章来源:https://blog.csdn.net/iqanchao/article/details/134959236
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。