使用安全的c++ new操作符

    我在很多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 }


 

转载于:https://www.cnblogs.com/beifei/archive/2011/10/22/2220903.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值