new,关于effective c++ 的总结2

这两个程序一个样

class Widget{
public:
 static std::new_handler set_new_handler (std::new_handler p) throw();
static void* operator new() throw(std::bad_alloc);
private:
std::new_handler currentHandler;
};
//static 函数一般调用static data member
//static 只能在类外定义
std::new_handler Widget::currentHandler = 0;
std::new_handler Widget::set_new_handler(std::new_handler p)throw()
{
    std::new_handler oldHandler = currentHandler;
    currentHandler = p;
    return oldHandler; 
}//这个类已对象管理资源,且用来保存new_handler(old)
//类外不用static

以复合类的方式写一个

class NewHandlerHolder{
public:
    explicit NewHandlerHolder(std::new_handler &nh)
    :HandlerHolder { } 
    ~NewHandlerHolder
    { std::set_new_handler(handler);}
    //我也是通过这里才反应过来set_new_handler的用处
    private:
    std::new_handler handler;

    NewHandlerHolder(const NewHandlerHolder&);
    NewHandlerHolder& operator=(const NewHandlerHolder&);
    //由于要被继承,只需声明,就能制止派生类copy
    };

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

与之前的operator new相比,这个类肯定几种所有复合类的优势,例如减少依存性,看上去也美观了。

要说说明的有,返回全局的new,保证handler还能继续被set_new_handler()调用

模版的另一种用法;

template <typename T>
class NewHandlerSupport{
public:
static std::new_handler set_new_handler                 (std::new_handler p) throw();
static void* operator new() throw(std::bad_alloc);
};
template <typename T>
NewHandlerSupport<T>::set_new_handler
(std::new_handler p)throw()
{
std::new_handler oldHandler = currentHandler;
    currentHandler = p;
    return oldHandler; 
}

template <typename T>
void* NewHandlerSupport<T>::operator new() throw(std::bad_alloc)
{
    NewHandlerHolder h(std::set_new_handler(currentHandler));
    return ::operator new(size);
}

====================================
item 51
除了讲伪码 ,还讲了size = 0时处理是把他赋值为1而new base,base 是不能为0 的,另外base中的size固定了,D继承以后应加上(size != sizeof(base)) return::operator new(size),要问错在哪里,齐位把!而且我现在从书上的例子完全也看不出B和D的new能有什么不同,但毕竟new是定制的,毕竟是为了优化,分配的单位毕竟也不同,怎么讲都是这样合理

而operator new[]不知道元素的个数,不能传size_t,元素的大小也是未知,所以总是分配一块未处理的内存,所以元素的个数是

总面积 / sizeof(元素)==>元素的个数

对于这样的话,这个new是不是可以继承了?
不清楚,书上没说,菜鸟的我就更不感妄加猜测了

猜你喜欢

转载自blog.csdn.net/qq_24328911/article/details/51206576