new 重载的规范

来源:互联网 发布:阿里云邮箱开启pop3 编辑:程序博客网 时间:2024/06/05 03:22
//如果内存分配请求成功,就返回指向内存的指针;如果失败,抛出一个std::bad_alloc类型的异常。//operator new实际上会不只一次地尝试着去分配内存,它要在每次失败后调用出错处理函数,还期望出错处理函数能想办法释放别处的内存。//只有在指向出错处理函数的指针为空的情况下,operator new才抛出异常。//非类成员形式的operator new的伪代码看起来会象下面这样:void * operator new(size_t size)// operator new还可能有其它参数{                                       if (size == 0) {// 处理0字节请求时,size = 1;                           // 把它当作1个字节请求来处理}                                     while (1) {分配size字节内存;if (分配成功)return (指向内存的指针);// 分配不成功,找出当前出错处理函数new_handler globalhandler = set_new_handler(0);set_new_handler(globalhandler);if (globalhandler) (*globalhandler)();else throw std::bad_alloc();}}

//关于new_handler //跳出循环的唯一办法是内存分配成功或出错处理函数new_handler完成了以下事件中的一种://  1.得到了更多的可用内存;删除其它无用的内存,使系统具有可以更多的内存可以使用,为下一步的内存申请作准备。//  2.安装了一个新的new-handler(出错处理函数);如果当前的new-handler函数不能产生更多的可用内存,可能它会知道另一个new-handler函数可以提供更多的资源。//  3.卸除了new-handler;也就是传递空指针给set_new_handler。没有安装new-handler,operator new分配内存不成功时就会抛出一个标准的std::bad_alloc类型的异常。//  4.抛出了一个std::bad_alloc或其派生类型的异常;//  5.没有返回。典型做法是调用abort或exit。//类成员new的重载 ,使用new_handler处理异常void* X::operator new( size_t size ){new_handler globalhandler =// 安装x的new_handler    std::set_new_handler( currenthandler);void *memory;try { // 尝试分配内存memory = ::operator new(tSize);}catch (std::bad_alloc&) { // 恢复旧的new_handlerstd::set_new_handler(globalhandler);      throw;// 抛出异常}std::set_new_handler(globalhandler);// 恢复旧的new_handlerreturn memory;}