new不抛出异常nothrow与new_handler】的更多相关文章

可以看这里: http://blog.csdn.net/huyiyang2010/article/details/5984987 现在的new是会抛出异常的,bad::alloc 如果不想抛出异常两种方法: 1. 用nothrow版本, new (std::nothrow) xxx(); 那样new失败会返回NULL 2. 加一个new_handler 但是注意不要直接改全部的,最好在自定义的operator new里面来加: 在operator new中做如下事情: 1.首先调用标准的set_…
C++ new的nothrow关键字和new_handler用法 new && new(std::nothrow) new(std::nothrow) 顾名思义,即不抛出异常,当new一个对象失败时,默认设置该对象为NULL,这样可以方便的通过if(p == NULL) 来判断new操作是否成功 普通的new操作,如果分配内存失败则会抛出异常,虽然后面一般也会写上if(p == NULL) 但是实际上是自欺欺人,因为如果分配成功,p肯定不为NULL:而如果分配失败,则程序会抛出异常,if语…
今天和同事review代码时,发现这样的一段代码: Manager * pManager = new Manager(); if(NULL == pManager) { //记录日志 return false; } 然后,一个同事就说这样写欠妥,应该改为: Manager * pManager = NULL; try { pManager = new Manager(); } catch(std::bad_alloc e) { //... } 我查了一下资料,发现: 1.malloc分配时,如果…
我们都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的.但是,如果你简单地把这一招应用到 new 上,那可就不一定正确了.我经常看到类似这样的代码:         int* p = new int[SIZE];        if ( p == 0 ) // 检查 p 是否空指针            return -1;        // 其它代码 其实,这里的 i…
本章开始讨论内存分配的一些用法,C/C++内存分配采用new和delete.在new申请内存时,可能会遇到的一种情况就是,内存不够了,这时候会抛出out of memory的异常.有的时候,我们希望能够调用自己定制的异常处理函数,这就是本条款要说的. 在声明于<new>的一个标准程序库中,有如下的接口: namespace std { typedef void (*new_handler)(); new_handler set_new_handler(new handler p) throw(…
C++中的new操作符首先使用operator new函数来分配空间,然后再在此空间上调用类的构造函数构造对象.当operator new无法分配所需的内存空间时,默认的情况下会抛出一个bad_alloc异常,在抛出这个异常之前,如果用户指定了错误处理函数即new_handler,则程序会先执行new_handler函数进行错误处理.为了设置这个错误处理函数,我们需要调用set_new_handler函数,它在std命名空间内的情况如下所示 namespace std{ typedef void…
1.使用operator new无法获取内存时,对于旧式编译器,会返回一个null指针.对于新式编译器,会抛出一个异常. 2.考虑下面的需求,当operator new 无法获取内存时,程序员期望获得通知,并调用一个方法.也就是说,向系统传递一个回调方法.这就是new_handler: typedef void (* new_handler) (void); new_handler是一个指针方法,形参为空,没有返回值. new_handler set_new_handler(new_handle…
std::nothrow 1.在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL. 若不使用std::nothrow,则分配失败时程序直接抛出异常. 2.使用方式: #include <new> #include <iostream> // for std::cerr #include <cstdlib> // for std::exit() Task * ptask = new (std::nothrow) Task; if (!pt…
当operator new申请一个内存失败的时候,它会进行如下的处理步骤:    1.如果存在客户指定的处理函数,则调用处理函数(new_handler),如果不存在则抛出一个异常. 2.继续申请内存分配请求.    3.判断申请内存是否成功,如果成功则返回内存指针,如果失败转向处理步骤1 为了自定义这个“用以处理内存不足”的函数new_handler,用户可以调用set_new_handler进行设置 这两个函数声明如下: namespace std{ typedef void (*new_h…
普通new一个异常的类型std::bad_alloc.这个是标准适应性态. 在早期C++的舞台上,这个性态和现在的非常不同:new将返回0来指出一个失败,和malloc()非常相似. 在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL. 在一定的环境下,返回一个NULL指针来表示一个失败依然是一个不错的选择. C++标准委员会意识到这个问题,所以他们决定定义一个特别的new操作符版本,这个版本返回0表示失败. 一个nothow new语句和普通的new语句相似,…