在阅读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的用法总结:
A* p = new (std::nothrow) ClassA();
//这样使用if语句会被执行,否则if语句不会执行
if (NULL == p) {...
}