作者:手机用户2502923607 | 来源:互联网 | 2023-10-11 01:34
#includevoid*operatornew(std::size_tsize)throw(std::bad_alloc)你的operatornew可能接受额
#includevoid *operator new(std::size_t size) throw(std::bad_alloc)//你的operator new可能接受额外的参数
{using namespace std;if (0 == size)//处理0-byte申请,将它视为1-byte申请size = 1;while (true){尝试分配size byteif (分配成功)return (一个指针,指向分配得来的内存);//分配失败,找出目前new-handling函数(见下)new_handler globalHandler = set_new_handler(0);set_new_handler(globalHandler);if (globalHandler)(*globalHandler)();elsethrow std::bad_alloc();}
}
class Base{
public:static void *operator new(std::size_t size) throw(std::bad_alloc);//...
};class Derived :public Base{//假设Derived未声明operator new//...
};Derived *p = new Derived;//这里调用的是Base::operator new
void *Base::operator new(std::size_t size) throw(std::bad_alloc)
{if (size != sizeof(Base))//如果大小错误return ::operator new(size);//令标准的operator new起而处理...//否则,在这里处理
}
void operator delete(void *rawMemory) throw()
{if (0 == rawMemory)//如果将被删除的是个null指针,那就什么都不用做return;现在,归还rawMemory所指的内存;
}
class Base{//一如以往,但此刻重点在operator delete
public:static void *operator new(std::size_t size) throw(std::bad_alloc);static void operator delete(void *rawMemory, std::size_t size) throw();...
};void Base::operator delete(void *rawMemory, std::size_t size) throw()
{if (rawMemory == 0) return;//检查null指针if (size != sizeof(Base))//如果大小错误,并标准版operator delete处理此处申请{::operator delete(rawMemory);return;}现在,归还rawMemory所指的内存;return;
}