首页 > 代码库 > 【effective c++】定制new和delete

【effective c++】定制new和delete

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