本文共 2849 字,大约阅读时间需要 9 分钟。
Effective C++: ??????C++?????
Effective C++??C++???????????????????????????????????C++??????????????????????????????????????
?C++??????? deallocation ??????????????????????????????????????????????????????????????????????????????????
???? std::new_handler ??????????????? deallocation ?????????????????
class NewHandlerHolder {public: explicit NewHandlerHolder(std::new_handler nh) : handler(nh) {} ~NewHandlerHolder() { std::set_new_handler(handler); }private: std::new_handler handler; NewHandlerHolder(const NewHandlerHolder& other); NewHandlerHolder& operator=(const NewHandlerHolder& other);}; ??? NewHandlerHolder ????????????????????
????????????????????????????????????????????
templateclass 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); static void* operator new(std::size_t size, std::nothrow_t& nt) throw();private: static std::new_handler currentHandler;};template std::new_handler NewHandlerSupport ::currentHandler = NULL;template std::new_handler NewHandlerSupport ::set_new_handler(std::new_handler p) throw() { std::new_handler oldHandler = currentHandler; currentHandler = p; return oldHandler;}template void* NewHandlerSupport ::operator new(std::size_t size, std::nothrow_t& nt) throw() { NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size, nt);}template void* NewHandlerSupport ::operator new(std::size_t size) throw(std::bad_alloc) { NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size);}
??? NewHandlerSupport ???????????????????????????????
???? NewHandlerSupport ??????????????????????????????????????? std::nothrow ??? crash?
templatevoid* NewHandlerSupport ::operator new(std::size_t size, std::nothrow_t& nt) throw() { NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size, nt);}
???????????????????? std::nothrow ????????? crash?
????????????????????????????
class Widget : public NewHandlerSupport{public: Widget() {} ~Widget() { std::cout << "Widget Destructor Enter" << std::endl; }};
?? Widget ???? NewHandlerSupport<Widget>????????????? deallocation ????
???????????????
int main() { std::cout << "Hello World!" << std::endl; Widget::set_new_handler(NULL); std::tr1::shared_ptr pW(new Widget); Widget* pw2 = ::new (std::nothrow) Widget; if (pw2) { delete pw2; } return 0;} ???????????????????????????
?????????????????????????????????????????Effective C++ ??????????????????????C++???
??????????????????????????
转载地址:http://cipfk.baihongyu.com/