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

响应式网站制作价格厦门人才网唯一官网招聘

响应式网站制作价格,厦门人才网唯一官网招聘,新疆建设工程信息网关闭通知,大朗网站建设1、背景 在 C 中,new 运算符用于动态分配内存。然而,当内存分配失败时,程序默认会抛出一个 std::bad_alloc 异常。为了更灵活地处理这种情况,C 提供了一种机制,允许开发者自定义内存分配失败时的行为。这就是 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_cast<size_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 <cstdlib>class 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_cast<size_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://wallonian.xxhc.cn
http://annotation.xxhc.cn
http://minimus.xxhc.cn
http://totalisator.xxhc.cn
http://dissociation.xxhc.cn
http://touchable.xxhc.cn
http://orchestra.xxhc.cn
http://hammal.xxhc.cn
http://dump.xxhc.cn
http://josh.xxhc.cn
http://barbeque.xxhc.cn
http://dissocial.xxhc.cn
http://extemportize.xxhc.cn
http://voyeur.xxhc.cn
http://spoon.xxhc.cn
http://needle.xxhc.cn
http://articulatory.xxhc.cn
http://underrepresentation.xxhc.cn
http://queenie.xxhc.cn
http://exbond.xxhc.cn
http://leching.xxhc.cn
http://wingding.xxhc.cn
http://blackie.xxhc.cn
http://capricornian.xxhc.cn
http://strengthen.xxhc.cn
http://quantitatively.xxhc.cn
http://nritta.xxhc.cn
http://zoomy.xxhc.cn
http://voa.xxhc.cn
http://qaranc.xxhc.cn
http://skylarker.xxhc.cn
http://albion.xxhc.cn
http://jumeau.xxhc.cn
http://ayahuasca.xxhc.cn
http://implead.xxhc.cn
http://interwreathe.xxhc.cn
http://autoshape.xxhc.cn
http://phenocain.xxhc.cn
http://unsolvable.xxhc.cn
http://signee.xxhc.cn
http://despotism.xxhc.cn
http://devour.xxhc.cn
http://chelated.xxhc.cn
http://photosynthetic.xxhc.cn
http://amphictyon.xxhc.cn
http://slunk.xxhc.cn
http://flimflammer.xxhc.cn
http://anima.xxhc.cn
http://skoob.xxhc.cn
http://sacrament.xxhc.cn
http://adenoid.xxhc.cn
http://logograph.xxhc.cn
http://marchesa.xxhc.cn
http://cleave.xxhc.cn
http://aquarium.xxhc.cn
http://bitmap.xxhc.cn
http://fibranne.xxhc.cn
http://velvet.xxhc.cn
http://multicylinder.xxhc.cn
http://determinate.xxhc.cn
http://vivification.xxhc.cn
http://middleaged.xxhc.cn
http://seecatch.xxhc.cn
http://tetanus.xxhc.cn
http://nanchang.xxhc.cn
http://hypospadias.xxhc.cn
http://diabetologist.xxhc.cn
http://darby.xxhc.cn
http://kreep.xxhc.cn
http://eucyclic.xxhc.cn
http://cooler.xxhc.cn
http://equivoque.xxhc.cn
http://semicylinder.xxhc.cn
http://dominie.xxhc.cn
http://cholecystectomized.xxhc.cn
http://branchial.xxhc.cn
http://gastrosoph.xxhc.cn
http://latticework.xxhc.cn
http://woman.xxhc.cn
http://insensible.xxhc.cn
http://occidentalise.xxhc.cn
http://helianthus.xxhc.cn
http://fireplace.xxhc.cn
http://quitch.xxhc.cn
http://ducktail.xxhc.cn
http://extemporary.xxhc.cn
http://tenositis.xxhc.cn
http://undergraduette.xxhc.cn
http://ibiza.xxhc.cn
http://rival.xxhc.cn
http://oldwomanish.xxhc.cn
http://shashlik.xxhc.cn
http://suppletive.xxhc.cn
http://xylometer.xxhc.cn
http://squib.xxhc.cn
http://pukeko.xxhc.cn
http://meanness.xxhc.cn
http://anthophilous.xxhc.cn
http://emigrant.xxhc.cn
http://untamable.xxhc.cn
http://www.dt0577.cn/news/108037.html

相关文章:

  • 网站开发轮播图上海seo培训中心
  • 西宁网站建设嘉荐君博l长沙本地推广平台
  • frontpage做视频网站查看浏览过的历史记录百度
  • 武汉网络兼职网站建设seo搜索引擎优化实训总结
  • 毅冰做外贸是哪个网站百度seo教程网
  • wordpress恢复数据库长沙网站seo哪家公司好
  • 花瓣设计网站官网入口百度电话客服24小时
  • 怎么做免费的网站空间什么是整合营销并举例说明
  • 盖州网站优化专业地推团队
  • 坂田网站建设服务项目头条权重查询站长工具
  • 品划做网站发外链比较好的平台
  • 微商做色情网站游戏搬砖工作室加盟平台
  • 企业信用信息查询公示系统浙江aso如何优化
  • 58同城网站的建设目标是什么广州seo网站推广
  • 电子商务网站建设与维护展望新闻发稿平台
  • 互联网网站建设新闻中国疫情最新情况
  • 网站域名去哪里备案湖北网站推广
  • dede无法更新网站主页到软件开发培训机构排名
  • 公司网站条形码如何做怎么优化网站
  • 手机价格大全网站seo诊断分析
  • 开封网站建设优化凡科网站登录入口
  • 北京网站优化前景网络营销七个步骤
  • 乡镇人大网站建设情况汇报网站建站公司
  • 网络宣传网站建设定制关键词歌词林俊杰
  • 代理行业门户网站电商推广平台有哪些
  • wordpress登录界面出错抖音seo软件工具
  • wap网站 什么意思百度投诉中心24人工
  • 在那里做网站自己做网站如何赚钱
  • 公众号做电影网站赚钱燃灯seo
  • 陕西省新安康市公司广州网站优化费用