博客
关于我
operator new and delete
阅读量:793 次
发布时间:2023-02-24

本文共 2849 字,大约阅读时间需要 9 分钟。

Effective C++: ??????C++?????

Effective C++??C++???????????????????????????????????C++??????????????????????????????????????

1. ???????

?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 ????????????????????

2. ?????????

????????????????????????????????????????????

template
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); 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 ???????????????????????????????

3. ?????????

???? NewHandlerSupport ??????????????????????????????????????? std::nothrow ??? crash?

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);}

???????????????????? std::nothrow ????????? crash?

4. ????

????????????????????????????

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;}

???????????????????????????

5. ??

?????????????????????????????????????????Effective C++ ??????????????????????C++???

??????????????????????????

转载地址:http://cipfk.baihongyu.com/

你可能感兴趣的文章
Oracle 11g数据库成功安装创建详细步骤
查看>>
Oracle 11g超详细安装步骤
查看>>
Oracle 12c中的MGMTDB
查看>>
Oracle 12c安装报错Installation failed to access the temporary location(无法访问临时位置)...
查看>>
Oracle 9i数据库管理教程
查看>>
ORACLE Active dataguard 一个latch: row cache objects BUG
查看>>
oracle avg、count、max、min、sum、having、any、all、nvl的用法
查看>>
Oracle BEQ方式连接配置
查看>>
oracle Blob保存方式,oracle 存储过程操作blob
查看>>
Oracle BMW Racing sailing vessel帆船图
查看>>
ORACLE Bug 4431215 引发的血案—原因分析篇
查看>>
Oracle Business Intelligence Downloads
查看>>
Oracle cmd乱码
查看>>
Oracle Corp甲骨文公司推出Oracle NoSQL数据库2.0版
查看>>
【Docker知识】将环境变量传递到容器
查看>>
uniapp超全user-agent判断 包括微信开发工具 hbuilder mac windows 安卓ios端及本地识别
查看>>
Oracle DBA课程系列笔记(20)
查看>>
oracle dblink 创建使用 垮库转移数据
查看>>
oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
查看>>
Oracle dbms_job.submit参数错误导致问题(ora-12011 无法执行1作业)
查看>>