std::nothrow
2015-11-05 14:22
281 查看
转载:/article/8119289.html
std::nothrow
在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL。
对于比较健壮的代码来说,nothrow使用的情况比直接new多很多吧。
直接new如果失败要抛出异常的,结果就是为了健壮性代码里到处都是try。
所以一般健壮的分配方式都用new (nothrow) xxx的(当然也有用malloc等的),之后判断NULL就ok了。
标准的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的代码将可以使用统一的变量名字。比如:
[cpp] view
plaincopy
#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对象来完成相同的效应:
[cpp] view
plaincopy
#include <new>
std::nothrow_t nt;
Task * ptask = new (nt) Task; //user-defined argument
if (!ptask)
//...
分配失败是非常普通的,它们通常在植入性和不支持异常的可移动的器件中发生更频繁。因此,应用程序开发者在这个环境中使用nothrow new来替代普通的new是非常安全的
std::nothrow
在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL。
对于比较健壮的代码来说,nothrow使用的情况比直接new多很多吧。
直接new如果失败要抛出异常的,结果就是为了健壮性代码里到处都是try。
所以一般健壮的分配方式都用new (nothrow) xxx的(当然也有用malloc等的),之后判断NULL就ok了。
标准的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的代码将可以使用统一的变量名字。比如:
[cpp] view
plaincopy
#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对象来完成相同的效应:
[cpp] view
plaincopy
#include <new>
std::nothrow_t nt;
Task * ptask = new (nt) Task; //user-defined argument
if (!ptask)
//...
分配失败是非常普通的,它们通常在植入性和不支持异常的可移动的器件中发生更频繁。因此,应用程序开发者在这个环境中使用nothrow new来替代普通的new是非常安全的
相关文章推荐
- 机器学习复习——Boosting
- Android系列教程之Activity的生命周期
- java编程实现邮件定时发送的方法
- IBOutlet property is strong or weak
- ScollView中嵌套ListView问题
- CocoaPods安装及其使用详解
- 关键字爬google的pdf
- SpringMVC介绍之视图解析器ViewResolver
- Android中的数据存储的五种方式
- Cache雪崩效应
- java notify notifyAll
- sqlite数据库简单查询命令
- html引用外部css文件
- 详解PHP中instanceof关键字及instanceof关键字有什么作用
- 【Android4高级编程】(1)创建应用程序和Activity
- JSON 入门指南
- JavaScript高级程序设计之DOM 扩展之HTML5之HTMLDocument的变化第11.3.3讲
- 处理错误:ORA-27101: shared memory realm does not exist
- mysql数据库同表复制处理
- PHP递归创建多级目录