码迷,mamicode.com
首页 > 编程语言 > 详细

【effective c++】定制new和delete

时间:2017-03-24 00:47:29      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:throw   ace   调用   抛出异常   stat   size_t   name   tor   const   

operator new 和 operator delete只适合用来分配单一对象。array所用的内存由operator new[]分配出来,并由operator delete[] 释放。

1、了解new-handler的行为

当operator new无法满足某一内存分配需求时,它会先调用指定的错误处理函数(new-handler),然后抛出异常。可通过set_new_handler函数来设置new-handler。

namespace std {
typedef void (*new_handler)();
new_handler set_new_handler(new_handler p) throw();
}

为当前class提供专属new-handler,只需为它提供自己的set_new_handler和operator new即可。

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

std::new_handler Widget::currentHandler = 0;

// 注意此处要返回之前使用的new_handler
std::new_handler Widget::set_new_handler(std::new_handler p) throw() {
    std::new_handler oldHandler = currentHandler;
    currentHandler = p;
    return oldHandler;
}

void* Widget::operator new(std::size_t size) throw(std::bad_alloc) {
    NewHandlerHolder h(std::set_new_handler(currentHandler));
    return ::operator new(size);
}

// 为确保原本的new-handler能够被重新安装回去, 运用资源管理对象
class NewHandlerHolder {
public:
    explicit NewHandlerHolder(std::new_handler nh): handler(nh){}
    ~NewHandlerHolder(){
        std::set_new_handler(handler);
    }
private:
    std::new_handler handler;
    // 防止copy
    NewHandlerHolder(const NewHandlerHolder&);
    NewHandlerHolder& operator=(const NewHandlerHolder&);
};

 


模板化:设定class专属的new-handler的类

 

【effective c++】定制new和delete

标签:throw   ace   调用   抛出异常   stat   size_t   name   tor   const   

原文地址:http://www.cnblogs.com/ljygoodgoodstudydaydayup/p/6607580.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!