/*编写new和delete时需固守常规*/
//非附属对象必须有独立的大小
#include<iostream>
using namespace std;
class Base{
public:
static void*operator new(std::size_t size) throw(std::bad_alloc);
//..
};
// operator new (pseudocode):
void *Base::operator new(std::size_t size)throw(std::bad_alloc){
using namespace std;
if(size==0){// 如果写了下面的if判断就不必写这里的if了,因为sizeof(Base)永远不会为零
size=1;
}
if(size!=sizeof(Base))//但这里如果子类用了基类的new也是不正确,比如在operator new[]时,而且这里是sizeof(Base) 不太可能与子类相等
return ::operator new(size);//
//... 处理上面的情况
while(true){
//尝试分配 size bytes;
if(分配成功)
return (一个指针,指向分配得来的内存);
//分配失败:找出目前的new-handling函数
new_handler globalHandler =set_new_handler(0);//通过调用set_new_handler找出new-handling 函数指针
set_new_handler(globalHandler);
if(globalHandler)
(*globalHandler);
else
throw std::bad_alloc();
}
void operator delete(void*rawMemory,std::size_t size)throw(){
if(rawMemory==0)return ;
if(size!=sizeof(Base){
::operator delete(rawMemory);//如果大小错误,令标准版处理申请
return ;
}
//现在,归还rawMemory所指针的内存,这里是基类,还需要加virtual
return ;
}
}
class Derived:public Base{// 假设子类没有声明operator new
//..
};
int main(){
Derived *p = new Derived;// 这里调用的基类的 new
return 0;
}
条款51:编写new和delete时需固守常规
最新推荐文章于 2022-08-19 01:23:27 发布