当前位置: 首页 > wzjs >正文

盐城网站建设效果破解wordpress主题教程

盐城网站建设效果,破解wordpress主题教程,傻瓜式 建网站,常宁seo外包在 C 中,当 operator new 无法满足内存分配请求时,它会有特定的处理机制,了解 new-handler 的行为对于处理内存分配失败的情况至关重要。下面结合代码详细介绍相关内容。 1. new-handler 基础概念 当 operator new 无法满足内存分配请求时&…

在 C++ 中,当 operator new 无法满足内存分配请求时,它会有特定的处理机制,了解 new-handler 的行为对于处理内存分配失败的情况至关重要。下面结合代码详细介绍相关内容。

1. new-handler 基础概念

当 operator new 无法满足内存分配请求时,会先调用用户指定的 new-handler 错误处理函数,之后才抛出异常。用户可以通过 set_new_handler 函数指定 new-handler

#include <iostream>
#include <new>// 自定义 new-handler 函数
void outOfMem() {std::cerr << "Unable to satisfy request for memory\n";std::abort();
}int main() {// 设置 new-handlerstd::set_new_handler(outOfMem);int *pBigDataArray = new int[100000000L];// 其他代码...return 0;
}

在上述代码中,如果 operator new 无法为 100000000 个整数分配空间,outOfMem 函数将被调用,程序会输出错误信息并中止。

2. 设计良好的 new-handler 应做的事情

一个设计良好的 new-handler 函数必须做到以下事情之一:

  • 释放更多内存:在程序启动时分配一大块内存,在 new-handler 第一次被调用时释放它供程序使用。
  • 安装不同的 new-handler:如果当前 new-handler 无法使更多内存可用,可安装另一个 new-handler
  • 卸载 new-handler:将空指针传给 set_new_handler,内存分配失败时 operator new 抛出异常。
  • 抛出异常:抛出 bad_alloc 或其派生类型的异常。
  • 不再返回:典型情况是调用 abort 或 exit
3. 类特定的 new-handler 实现

C++ 没有直接支持类特定的 new-handler,但可以自己实现。通过为每个类提供 set_new_handler 和 operator new 的自定义版本来实现。

#include <iostream>
#include <new>// 资源管理类,用于管理 new-handler
class NewHandlerHolder {
public:explicit NewHandlerHolder(std::new_handler nh) : handler(nh) {}~NewHandlerHolder() { std::set_new_handler(handler); }private:std::new_handler handler;NewHandlerHolder(const NewHandlerHolder&);NewHandlerHolder& operator=(const NewHandlerHolder&);
};// 支持类特定 new-handler 的模板基类
template <typename T>
class NewHandlerSupport {
public:static std::new_handler set_new_handler(std::new_handler p) throw();static void * operator new(std::size_t size) throw(std::bad_alloc);private:static std::new_handler currentHandler;
};template <typename T>
std::new_handler 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(std::size_t size) throw(std::bad_alloc) {NewHandlerHolder h(std::set_new_handler(currentHandler));return ::operator new(size);
}template <typename T>
std::new_handler NewHandlerSupport<T>::currentHandler = 0;// Widget 类,继承自 NewHandlerSupport
class Widget : public NewHandlerSupport<Widget> {// 其他成员...
};// 自定义 new-handler 函数
void outOfMem() {std::cerr << "Widget memory allocation failed\n";std::abort();
}int main() {// 设置 Widget 类的 new-handlerWidget::set_new_handler(outOfMem);Widget *pw1 = new Widget;// 其他代码...return 0;
}

在这个例子中,NewHandlerSupport 是一个模板基类,Widget 类继承自 NewHandlerSupport<Widget>,通过这种方式为 Widget 类提供了类特定的 new-handler

4. 奇特的递归模板模式(CRTP)

NewHandlerSupport 模板使用了奇特的递归模板模式(CRTP)。模板参数 T 仅用于区分不同的继承类,模板机制会为每个实例化的 NewHandlerSupport<T> 生成一个 currentHandler 的拷贝。

5. nothrow new

直到 1993 年,C++ 要求 operator new 分配失败时返回空指针。现在标准规定抛出 bad_alloc 异常,但为了兼容旧代码,提供了 nothrow 形式的 operator new

#include <iostream>
#include <new>class Widget {// 类定义...
};int main() {Widget *pw1 = new Widget; // 分配失败抛出 bad_alloc 异常if (pw1 == 0) {// 此测试必然失败}Widget *pw2 = new (std::nothrow) Widget; // 分配失败返回 0if (pw2 == 0) {// 此测试可能成功}return 0;
}

需要注意的是,nothrow new 只能保证 operator new 不会抛出异常,但后续的构造函数调用仍可能抛出异常。

总结要点

  • set_new_handler 的使用set_new_handler 允许指定一个在内存分配请求无法满足时调用的函数,通过自定义 new-handler 函数可以处理内存分配失败的情况。
  • 类特定的 new-handler:通过自定义 set_new_handler 和 operator new 以及使用 CRTP 模板基类,可以为每个类提供类特定的 new-handler
  • nothrow new 的局限性nothrow new 仅适用于内存分配,后续的构造函数调用可能依然会抛出异常,其作用有限。
http://www.dtcms.com/wzjs/839922.html

相关文章:

  • 电商网站规划论文wordpress怎样禁止采集
  • 洛阳霞光做网站公司电商运营模式
  • 网站网络推广优化数控车床编程入门自学
  • 南宁网站建设哪家公司实力读了成考好后悔啊
  • 3000元网站建设三年php网站开发学校
  • 沈阳网站建设教案模板用股票代码做网站的
  • 福州做彩票app网站网站页面设计说明
  • 网站制作 服务石河子网站制作
  • 网站开发协议书 英文版洛阳建设企业网站公司
  • 外汇黄金网站建设hulu网站在中国做内容吗
  • 专业网站建设好发信息网国内为啥不用wordpress开发
  • 哪些网站可宣传vps里面网站php页面无法打开
  • 自己做自营网站电子商务网站建设参考文献2018
  • 创新的邯郸网站建设国际贸易网址
  • 酒泉建设局网站国外做免费的视频网站
  • 永嘉网站制作公司mvc5 网站开发之美
  • 门户网站建站注意事项网站开发设计是前端吗
  • 网站源码破解黑龙江企业网站设计团队
  • 腾讯云网站建设个人网站html模板
  • jsp可以做网站首页吗道滘镇仿做网站
  • 有了自己的域名怎么做网站重庆招标信息网
  • 九江的网站建设公司东莞营销网站建设优化
  • 淄博乐达网站建设吧网站模版的优化
  • 网站设计步骤大全网络推广价格
  • 网站校园推广案例嘉兴网站开发公司电话
  • 东莞市企业网站制作企业品牌建设包括
  • 汕头网站建设公司电商税收新政策2021
  • 微信小程序做网站企业网站用免费程序
  • 支付宝接口 网站备案小程序怎么删除
  • 肇庆网站开发苏州市网站