关于std::nothrow

http://hi.baidu.com/ilbx/blog/item/30a2c9f550299d2dbd31090f.html


nothrow new与普通new
2009-03-01 16:57
标准的new头文件可以定义普通的new,同时,它也可以定义一个变体new操作符,这个操作符叫做nothrownew。普通的new:过去和现在   普通new一个异常的类型std::bad_alloc。这个是标准适应性态。在早期C++的舞台上,这个性态和现在的非常不同;new将返回0来指出一个失败,和malloc()非常相似。
   在一定的环境下,返回一个NULL指针来表示一个失败依然是一个不错的选择。C++标准委员会意识到这个问题,所以他们决定定义一个特别的new操作符版本,这个版本返回0表示失败。
   一个nothow new语句和普通的new语句相似,除了它的变量将涉及到std::nothrow_t。Class std::nothrow_t在new将按照下面的方式来定义:
 
class nothrow_t // in namespace std
                 {}; //empty class
Operator nothrow new is declared like this:
//declarations from <new>
void *   operator new (size_t size, const std::nothrow_t &);
//array version
void *   operator new[] (size_t size, const std::nothrow_t &);
In addition, <new> defines a const global object of type nothrow_t:
extern const nothrow_t nothrow; //in namespace std


   按照这个方式,调用nothrow new的代码将可以使用统一的变量名字。比如:
#include <new>
#include <iostream> // for std::cerr
#include <cstdlib> // for std::exit()
Task * ptask = new (std::nothrow) Task;
if (!ptask)
{
std::cerr<<"allocation failure!";
std::exit(1);
}
//... allocation succeeded; continue normally 


但是,你可以注意到你创建了你自己的nothrow_t对象来完成相同的效应:

#include <new>
std::nothrow_t nt;
Task * ptask = new (nt) Task; //user-defined argument
if (!ptask)
//... 

分配失败是非常普通的,它们通常在植入性和不支持异常的可移动的器件中发生更频繁。因此,应用程序开发者在这个环境中使用nothrow new来替代普通的new是非常安全的。



http://www.cplusplus.com/reference/std/new/nothrow/


extern const nothrow_t nothrow;

Nothrow constant

This constant value is used as an argument for operator new and operator new[] to indicate that these functions shall not throw an exception on failure, but return a null pointer instead.

By default, when the new operator is used to allocate memory and the handling function is unable to do so, a bad_alloc exception is thrown. But when nothrow is used as argument for new, it returns a null pointer instead.

This constant ( nothrow) is just a value of type nothrow_t, which only purpose is to trigger an overloaded version of function operator new or operator new[] that takes an argument of this type.

In C++, the new operator can be overloaded to take more than one parameter: The first parameter passed to the operator new function is always the size of the element type to be allocated, but more arguments can be passed to this function by enclosing them in parentheses. For example:

int * p = new (x) int;

is a valid expression that, at some point, calls:

operator new (sizeof(int),x);

By default, one of the versions of operator new is overloaded to accept a parameter of type nothrow_t (like nothrow). The value itself is not used, but that version of operator new shall return zero in case of failure instead of throwing an exception.

The same applies for operator new[] and function operator new[] .

Example

// nothrow example
#include <iostream>
#include <new>
using namespace std;

int main () {
  cout << "Attempting to allocate 1 MiB...";
  char* p = new (nothrow) char [1048576];
  if (p==0) cout << "Failed!\n";
  else {
    cout << "Success!\n";
    delete[] p;
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值