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

网站备案服务号端游网络游戏排行榜

网站备案服务号,端游网络游戏排行榜,服装网站建设背景,网站镜像上传到域名空间1、背景 在 C 中#xff0c;new 运算符用于动态分配内存。然而#xff0c;当内存分配失败时#xff0c;程序默认会抛出一个 std::bad_alloc 异常。为了更灵活地处理这种情况#xff0c;C 提供了一种机制#xff0c;允许开发者自定义内存分配失败时的行为。这就是 new-han…1、背景 在 C 中new 运算符用于动态分配内存。然而当内存分配失败时程序默认会抛出一个 std::bad_alloc 异常。为了更灵活地处理这种情况C 提供了一种机制允许开发者自定义内存分配失败时的行为。这就是 new-handler 机制的作用。new-handler 是一种回调函数当 new 操作符无法分配内存时运行时系统会调用这个回调函数。通过设置自定义的 new-handler开发者可以在内存分配失败时执行一些特定的操作例如 释放未使用的内存。记录错误日志。尝试再次分配内存。终止程序或采取其他恢复措施。 new-handler 的设计使程序能够优雅地应对内存分配失败而不是直接崩溃。 2、如何使用new-handler C 提供了两个与 new-handler 相关的标准函数 std::set_new_handler用于设置全局的 new-handler 函数定义在头文件 中。std::new_handler是一个函数指针指向当前的 new-handler以下是 std::set_new_handler 的函数签名 #include new std::new_handler std::set_new_handler(std::new_handler new_p) noexcept;参数new_p 是指向新的 new-handler 函数的指针。返回值返回之前设置的 new-handler。异常保证此函数不抛出任何异常。 3、示例代码 以下是一个完整示例展示如何使用 std::set_new_handler 设置自定义的 new-handler。 #include iostream #include new // std::set_new_handler #include cstdlib // std::abort// 自定义 new-handler 函数 void myNewHandler() {std::cerr Memory allocation failed. Attempting to recover... std::endl;// 可以选择释放资源或记录日志// 示例直接终止程序std::abort(); }int main() {// 设置全局的 new-handlerstd::set_new_handler(myNewHandler);try {// 故意尝试分配超大内存size_t size static_castsize_t(-1);int* p new int[size];delete[] p;} catch (const std::bad_alloc e) {std::cerr Caught exception: e.what() std::endl;}return 0; }输出结果Memory allocation failed. Attempting to recover… 因为当 new 运算符无法分配内存时运行时调用了自定义的 myNewHandler打印错误信息并终止程序。如果未设置 new-handler程序默认会抛出 std::bad_alloc 异常。 有时我们可能希望为某个特定的类设置专属的 new-handler而不是全局生效。这可以通过类的静态成员函数实现代码如下 #include iostream #include new #include cstdlibclass Widget { public:// 设置类专属的 new-handlerstatic void setNewHandler(std::new_handler p) noexcept {currentHandler p;}// 重载 operator new使用类专属的 new-handlerstatic void* operator new(size_t size) {std::new_handler oldHandler std::set_new_handler(currentHandler);void* mem;try {mem ::operator new(size);} catch (...) {std::set_new_handler(oldHandler); // 恢复旧的 handlerthrow; // 继续抛出异常}std::set_new_handler(oldHandler); // 恢复旧的 handlerreturn mem;}private:static std::new_handler currentHandler; };// 定义静态成员 std::new_handler Widget::currentHandler nullptr;// 自定义 new-handler void customNewHandler() {std::cerr Widget allocation failed. Cleaning up... std::endl;std::abort(); }int main() {Widget::setNewHandler(customNewHandler);try {// 尝试分配超大内存Widget* w new Widget[static_castsize_t(-1)];delete[] w;} catch (const std::bad_alloc e) {std::cerr Caught exception: e.what() std::endl;}return 0; }4、使用new-handler的注意事项 确保 new-handler 是无异常的new-handler 必须是 noexcept 函数。如果 new-handler 抛出异常标准库会调用 std::terminate。处理恢复逻辑在 new-handler 中尝试释放未使用的内存或其他资源尽量避免直接终止程序。避免递归调用如果在 new-handler 中尝试再次分配内存可能导致递归调用 new-handler最终导致程序崩溃。线程安全性std::set_new_handler 会影响全局的 new-handler因此在多线程环境下使用时需要格外小心。 5、总结 new-handler 是 C 提供的一种强大的机制允许开发者在内存分配失败时定制处理逻辑。通过全局或类专属的 new-handler程序可以优雅地应对内存不足的情况。尽管如此new-handler 的使用需要谨慎。合理地释放资源、避免递归调用以及处理异常是实现一个可靠 new-handler 的关键。
http://www.dnsts.com.cn/news/268604.html

相关文章:

  • 定制网站和模板网站有何区别wordpress+登录+api接口
  • 网站建设亿玛酷适合5wordpress数据库更改用户密码
  • 电商资讯网站有哪些做网站项目如何实现支付
  • 互联网招聘网站排行昆明系统开发
  • 肇庆网站建设公司哪个好衣服网站建设方案
  • 电商网站建设投资预算办公空间设计思路
  • 潍坊专业网站建设镇江seo网站
  • 福山区建设工程质量检测站网站百度推广网络推广微信网站
  • 彩票网站开发的风险上海网站制作找缘魁
  • 网站开发发展趋势怎么制作ppt课件
  • 综合性电商网站建设郑州保洁公司
  • 《网站推广策划》广告主资源哪里找
  • 个人主页界面网站h5制作工具有哪四个
  • 网站关键词引流汉中网站建设价格
  • 计算机网络资源网站建设论文网络营销论文1500字
  • 网站建设军成苏州高端网站设计制作
  • 四川德充建设集团有限公司网站企业官网型网站模板下载
  • 配资网站开发是什么意思女生学什么技术最吃香
  • 如何做网站网页如何做英文网站
  • 做响应式网站价格广西建设职业技术学院贫困生网站
  • 网站设计公司行业排名网站建设之婚礼摄影网站设计
  • dw做的网站如何用手机看php做网站用框架
  • 专做药材的网站有哪些做网站属于广告公司吗
  • 网站插件代码下载教育培训机构有哪些
  • 房管局备案查询网站wordpress 文章 样式
  • 东莞百度搜索网站排名婚庆网站开发要达到的目标
  • 泉州模板开发建站上海开展扫黄打非专项检查
  • 搜狐最大的门户网站济南网站优化网站
  • 固原地网站seo官方网站免费建设
  • 提升审美网站网页设计电商网站