我在很多C++程序中利用new操作符写如下的代码:
1 Node *pnode = new Node;
2 if(pnode == NULL)
3 {
4 fprintf(stderr, "create Node object failed\n");
5 return -1;
6 }
7
先分析一些new操作符的调用流程,new操作符首先会调用operator new来分配内存,内存分配完毕后会调用Node的构造函数来初始化Node对象。在创建Node对象之后判断指针是否为NULL完全是延续C中malloc的判断方式,在C++中这种方式有没有问题呢,这得看一下operator new的实现方式。
operator new有以下实现版本:
1 void* operator new (std::size_t size) throw (std::bad_alloc);
2 void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
3 void* operator new (std::size_t size, void* ptr) throw();
我在上面代码中调用的是第一个版本的operator new,这个版本的operator new在分配内存失败会抛出一个bad_alloc异常,所以我们在代码中判断指针是否为NULL根本hold不住。如果我们不想去care异常,而采用C中NULL指针的判断方式,我们就需要调用nothrow版本的operator new。这个版本的operator new在分配内存失败后会返回一个NULL指针,这样一切都恢复如初了。
nothrow版本的代码如下:
1 Node *pnode = new(std::nothrow) Node;
2 if(pnode == NULL)
3 {
4 fprintf(stderr, "create Node object failed\n");
5 return -1;
6 }