这两个程序一个样
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是不是可以继承了?
不清楚,书上没说,菜鸟的我就更不感妄加猜测了