Item 49:new handler的行为
Posted harttle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Item 49:new handler的行为相关的知识,希望对你有一定的参考价值。
set_new_handler()
namespace std
typedef void (*new_handler)();
new_handler set_new_handler(new_handler p) throw();
void outOfMem()
std::cout<<"Unable to alloc memory";
std::abort();
int main()
std::set_new_handler(outOfMem);
int *p = new int[100000000L];
类型相关错误处理
class Widget
public:
static std::new_handler set_new_handler(std::new_handler p) throw();
static void * operator new(std::size_t size) throw(std::bad_alloc);
private:
static std::new_handler current;
;
// 静态成员需要定义在类的外面
std::new_handler Widget::current = 0;
std::new_handler Widget::set_new_handler(std::new_handler p) throw()
std::new_handler old = current;
current = p;
return old;
重载operator new
class NewHandlerHolder
public:
explicit NewHandlerHolder(std::new_handler nh): handler(nh)
~NewHandlerHolder() std::set_new_handler(handler);
private:
std::new_handler handler;
NewHandlerHolder(const HandlerHolder&); // 禁用拷贝构造函数
const NewHandlerHolder& operator=(const NewHandlerHolder&); // 禁用赋值运算符
;
void * Widget::operator new(std::size_t size) throw(std::bad_alloc)
NewHandlerHolder h(std::set_new_handler(current));
return ::operator new(size); // 调用全局的new,抛出异常或者成功
// 函数调用结束,原有错误处理函数恢复
使用Widget::operator new
void outOfMem();
Widget::set_new_handler(outOfMem);
Widget *p1 = new Widget; // 如果失败,将会调用outOfMem
string *ps = new string; // 如果失败,将会调用全局的 new-handling function,当然如果没有的话就没有了
Widget::set_new_handler(0); // 把Widget的异常处理函数设为空
Widget *p2 = new Widget; // 如果失败,立即抛出异常
通用基类
template<typename T>
class NewHandlerSupport
public:
static std::new_handler set_new_handler(std::new_handler p) throw();
static void * operator new(std::size_t size) throw(std::bad_alloc);
private:
static std::new_handler current;
;
template<typename T>
std::new_handler NewHandlerSupport<T>::current = 0;
template<typename T>
std::new_handler NewHandlerSupport<T>::set_new_handler(std::new_handler p) throw()
std::new_handler old = current;
current = p;
return old;
template<typename T>
void * NewHandlerSupport<T>::operator new(std::size_t size) throw(std::bad_alloc)
NewHandlerHolder h(std::set_new_handler(current));
return ::operator new(size);
class Widget: public NewHandlerSupport<Widget> ... ;
nothrow new
Widget *p1 = new Widget; // 失败时抛出 bad_alloc 异常
assert(p1 != 0); // 这总是成立的
Widget *p2 = new (std::nothrow) Widget;
if(p2 == 0) ... // 失败时 p2 == 0
本文地址:http://harttle.com/2015/09/17/effective-cpp-49.html
以上是关于Item 49:new handler的行为的主要内容,如果未能解决你的问题,请参考以下文章