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

1万+

被折叠的 条评论
为什么被折叠?



