手机商城网站建设设计方案东莞数据线厂家东莞网站建设

bicheng/2026/1/22 21:17:28/文章来源:
手机商城网站建设设计方案,东莞数据线厂家东莞网站建设,网站手机版方案,论文网站开发条款 49#xff1a;了解 new-handler 的行为 当operator new无法满足某一内存分配需求时#xff0c;会不断调用一个客户指定的错误处理函数#xff0c;即所谓的 new-handler#xff0c;直到找到足够内存为止 new-handler 是一个 typedef#xff0c;指向一个无参数值无返回…条款 49了解 new-handler 的行为 当operator new无法满足某一内存分配需求时会不断调用一个客户指定的错误处理函数即所谓的 new-handler直到找到足够内存为止 new-handler 是一个 typedef指向一个无参数值无返回值的函数。可以通过 set_new_handler 函数去指定客户想要的 new-handler。 set_new_handler 函数接受一个新的 new-handler 参数返回被替换掉的 new-handler 函数 namespace std {using new_handler void(*)();new_handler set_new_handler(new_handler) noexcept; // 返回值为原来持有的 new-handler }设计良好的 new-handler 函数 让更多的内存可被使用 可以让程序一开始执行就分配一大块内存而后当 new-handler 第一次被调用将它们释还给程序使用造成operator new的下一次内存分配动作可能成功。安装另一个 new-handler如果当前的new-handler不能够为你提供更多的内存可能另外一个new-handler可以。即在当前的new-handler的位置上安装另外一个new-handler通过调用set_new_handler。下次operator new调用new-handler函数的时候它会调用最近安装的。这需要让new_handler修改会影响new-handler行为的static数据,命名空间数据或者全局数据卸除 new-handler 将nullptr传给set_new_handler使operator new在内存分配不成功时抛出异常抛出 bad_alloc或派生自 bad_alloc的异常 这样的异常不会被operator new捕捉会被传播到内存分配处不返回 通常调用std::abort或std::exit 以不同的方式处理内存分配的情况比如按不同的 class 进行处理。c 并不支持为每一个 class 提供专属版本的 new_handler要用静态成员 public:static std::new_handler set_new_handler(std::new_handler p) noexcept;static void* operator new(std::size_t size); private:static std::new_handler currentHandler; }; // 做和 std::set_new_handler 相同的事情 std::new_handler Widget::set_new_handler(std::new_handler p) noexcept {std::new_handler oldHandler currentHandler;currentHandler p;return oldHandler; } void* Widget::operator new(std::size_t size) {auto globalHandler std::set_new_handler(currentHandler); // 切换至 Widget 的专属 new-handlervoid* ptr ::operator new(size); // 分配内存或抛出异常std::set_new_handler(globalHandler); // 切换回全局的 new-handlerreturn globalHandler; } std::new_handler Widget::currentHandler nullptr;以对象管理资源的方法 class NewHandlerHolder { public:explicit NewHandlerHolder(std::new_handler nh): handler(nh) {} ​~NewHandlerHolder() {std::set_new_handler(handler);} ​ private:std::new_handler handler; };Widget::operator new的实现可改为 void* Widget::operator new(std::size_t size) noexcept{NewHandlerHolder h(std::set_new_handler(currentHandler));return ::operator new(size); }Widget的客户调用 : void OutOfMem(); Widget::set_new_handler(OutOfMem); auto pw1 new Widget; // 若分配失败则调用 OutOfMem Widget::set_new_handler(nullptr); auto pw2 new Widget; // 若分配失败则抛出异常上述代码每个class要实现自己的set_new_handler和operator new。可以用template。建立起一个“mixin”风格的基类让其派生类继承它们所需的set_new_handler和operator new并且使用模板确保每一个派生类获得一个实体互异的currentHandler成员变量 templatetypename T class NewHandlerSupport { // “mixin”风格的基类 public:static std::new_handler set_new_handler(std::new_handler p) noexcept;static void* operator new(std::size_t size);... // 其它的 operator new 版本见条款 52 private:static std::new_handler currentHandler; };templatetypename T std::new_handler NewHandlerSupportT::set_new_handler(std::new_handler p) noexcept {std::new_handler oldHandler currentHandler;currentHandler p;return oldHandler; }templatetypename T void* NewHandlerSupportT::operator new(std::size_t size) {auto globalHandler std::set_new_handler(currentHandler);void* ptr ::operator new(size);std::set_new_handler(globalHandler);return globalHandler; }templatetypename T std::new_handler NewHandlerSupportT::currentHandler nullptr;class Widget : public NewHandlerSupportWidget { public:... // 不必再声明 set_new_handler 和 operator new };此处的模板参数T并没有真正被当成类型使用而仅仅是用来区分不同的派生类使得模板机制为每个派生类具现化出一份对应的currentHandler 即 CRTPcurious recurring template pattern奇异递归模板模式也被用于实现静态多态 template class Derived struct Base {void Interface() {static_castDerived*(this)-Implementation(); // 在基类中暴露接口} }; struct Derived : BaseDerived {void Implementation(); // 在派生类中提供实现 };C 保留了传统的“分配失败便返回空指针”的operator new称为 nothrow new通过std::nothrow对象来使用 Widget* pw1 new Widget; // 如果分配失败抛出 bad_alloc if (pw1 nullptr) ... // 这个测试一定失败 Widget* pw2 new (std::nothrow) Widget; // 如果分配失败返回空指针 if (pw2 nullptr) ... // 这个测试可能成功条款50了解new和delete的合理替换时机 定制operator new和operator delete的理由 用来检测运行上的错误如果将“new 所得内存”delete 掉却不幸失败会导致内存泄漏如果在“new 所得内存”身上多次 delete 则会导致未定义行为。如果令operator new持有一串动态分配所得地址而operator delete将地址从中移除就很容易检测出上述错误用法 另外自定义new分配超额内存在额外空间放置特定签名/byte pattern。在delete时检查是否不变反之肯定存在“overruns”写入点在分配区块尾部之后或“unferruns”写入点在分配区块头部之前delete也可log那个指针。例如 static const int signature 0xDEADBEEF; // 调试“魔数” using Byte unsigned char;void* operator new(std::size_t size) {using namespace std;size_t realSize size 2 * sizeof(int); // 分配额外空间以塞入两个签名void* pMem malloc(realSize); // 调用 malloc 取得内存if (!pMem) throw bad_alloc();// 将签名写入内存的起点和尾端*(static_castint*(pMem)) signature;*(reinterpret_castint*(static_castByte*(pMem) realSize - sizeof(int))) signature;return static_castByte*(pMem) sizeof(int); // 返回指针指向第一个签名后的内存位置 }这段代码不保证内存对齐许多地方不遵守c规范见条款51 收集使用上的统计数据 定制 new 和 delete 动态内存的相关信息分配区块的大小分布寿命分布FIFO先进先出、LIFO后进先出或随机次序的倾向性不同的分配/归还形态使用的最大动态分配量等等。 增加分配和归还的速度泛用型分配器通常比定制分配器慢。类专属的分配器可以做到“区块尺寸固定”例如 Boost 提供的 Pool 程序库。又例如编译器所带的内存管理器是线程安全的但如果你的程序是单线程的你也可以考虑写一个不线程安全的分配器来提高速度 降低缺省内存管理器带来的空间额外开销泛用型分配器通常比定制分配器使用更多内存。因为常常在每一个分配区块身上招引某些额外开销。针对小型对象而开发的分配器例如 Boost 的 Pool 程序库本质上消除了这样的额外开销 弥补缺省分配器中的非最佳内存对齐许多计算机体系架构要求特定的类型必须放在特定的内存地址上如果没有奉行这个约束条件可能导致运行期硬件异常或者访问速度变低。std::max_align_t用来返回当前平台的最大默认内存对齐类型对于malloc分配的内存其对齐和max_align_t类型的对齐大小应当是一致的但若对malloc返回的指针进行偏移就没有办法保证内存对齐 C11 中内存对齐相关方法 将相关对象成簇集中如果知道特定的某个数据结构往往被一起使用又希望在处理这些数据时将“内存页错误page faults”的频率降至最低可以考虑为此数据结构创建一个堆将它们成簇集中在尽可能少的内存页上。一般可以使用 placement new 达成这个目标条款52 获得非传统的行为如分配和归还共享内存这些事情只能被 C API 完成则可以将 C API 封在 C 的外壳里写在定制的 new 和 delete 中 条款 51编写 new 和 delete 时需固守常规 编写自己的new存不足时必须不断调用 new-handler如果无法供应客户申请的内存就抛出std::bad_alloc异常。即使客户需求为0字节operator new也得返回一个合法的指针 void* operator new(std::size_t size) {using namespace std;if (size 0) // 处理0字节申请size 1; // 将其视为1字节申请while (true) {if (...) // 如果分配成功return ...; // 返回指针指向分配得到的内存// 如果分配失败调用目前的 new-handlerauto globalHandler get_new_handler(); // since C11if (globalHandler) (*globalHandler)();else throw std::bad_alloc();} }如果子类未声明自己的operator new会从父类继承过来使的子类使用了父类new分配方式。但子类与父类的大小多数时候是不同的因此成员函数版本 void* Base::operator new(std::size_t size) {if (size ! sizeof(Base))return ::operator new(size); // 转交给标准的 operator new 进行处理... }此时无需检测大小是否为0因为类必须有非零大小条款39 如果要实现operator new[]即array new唯一要做的就是分配一块未加工的原始内存。因为无法对尚未存在的元素对象做任何事甚至无法计算含有多少个对象 编写自己的delete删除空指针永远安全 void operator delete(void* rawMemory) noexcept {if (rawMemory 0) return;// 归还 rawMemory 所指的内存 }成员函数版本 void Base::operator delete(void* rawMemory, std::size_t size) noexcept {if (rawMemory 0) return;if (size ! sizeof(Base)) {::operator delete(rawMemory); // 转交给标准的 operator delete 进行处理return;}// 归还 rawMemory 所指的内存 }条款 52写了 placement new 也要写 placement delete placement new如果你的new接收的参数除了必定有的size_t外还有其他 void* operator new(std::size_t, std::ostream logStream); auto pw new (std::cerr) Widget;elete同理 当创建对象时会先进行new函数然后调用构造函数如果构造出现异常就需要delete否则内存泄漏但客户手上的指针仍未指向该被归还的内存因此由c系统本身调用delete。系统需要知道哪个delete该被调用 当抛出异常时运行期系统会寻找参数个数和类型都与 operator new 相同的某个 operator delete。 placement delete 只有在 placement new 的调用构造函数异常时才会被系统调用即使对一个用 placement new 申请出的指针使用 delete也绝不会调用 placement delete。因此如果要处理 placement new 相关的内存泄漏问题我们必须同时提供一个正常版本的 delete 和 placement 版本的 delete。前者用于构造期间无异常抛出后者用于构造期间有异常抛出 class Widget { public:static void* operator new(std::size_t size, std::ostream logStream); // placement newstatic void operator delete(void* pMemory); // delete 时调用的正常 operator deletestatic void operator delete(void* pMemory, std::ostream logStream); // placement delete };还要注意同名函数遮掩调用的问题 class Base { public:static void* operator new(std::size_t size, std::ostream logStream);... }; auto pb new Base; // 无法通过编译 auto pb new (std::cerr) Base; // 正确同理子类的operator new会遮掩global和父类继承的operator new版本 class Derived : public Base { public:static void* operator new(std::size_t size);... };auto pd new (std::clog) Derived; // 无法通过编译 auto pd new Derived; // 正确除非目的就是禁用否则要确保这些默认形式对定制类型依然可用 void* operator(std::size_t) throw(std::bad_alloc); // normal new void* operator(std::size_t, void*) noexcept; // placement new void* operator(std::size_t, const std::nothrow_t) noexcept; // nothrow new可以准备一个基类包含所有的正常版本new和delete class StadardNewDeleteForms{ public:// normal new/deletestatic void* operator new(std::size_t size){return ::operator new(size);}static void operator delete(void* pMemory) noexcept {::operator delete(pMemory);}// placement new/deletestatic void* operator new(std::size_t size, void* ptr) {return ::operator new(size, ptr);}static void operator delete(void* pMemory, void* ptr) noexcept {::operator delete(pMemory, ptr);}// nothrow new/deletestatic void* operator new(std::size_t size, const std::nothrow_t nt) {return ::operator new(size,nt);}static void operator delete(void* pMemory,const std::nothrow_t) noexcept {::operator delete(pMemory);} };凡是需要自定义的class可以继承该类并使用using声明式条款33

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速收录网站内页html网页制作成品

前言 BOP是6D位姿估计基准,汇总整理了多个数据集,还举行挑战赛,相关报告被CVPR2024接受和认可。 它提供3D物体模型和RGB-D图像,其中标注信息包括6D位姿、2D边界框和2D蒙版等。 包含数据集:LM 、LM-O 、T-LESS 、IT…

武义建设局网站长沙网站建设多少钱

在nextjs项目中,发现两个组件没啥关系,例如一个是一直存在的头部组件,另一个是页面中的组件,当我点击头部组件中的特定按钮时,把数据传递到页面组件中,页面组件接受到canshu数据后在做其他操作,…

添加网站关键词华为认证培训机构排行榜

在大数据时代,我们每天都在生成和处理海量数据。但数据本身,如果没有适当的上下文和描述,就像是一堆没有翻译的古老文字。这就是元数据发挥作用的地方——它是大数据世界的罗塞塔石碑,为我们提供了理解和利用数据的关键。 文章目录…

广东电商网站建设网站建设工作会议上的讲话

现代实时应用的复杂性和需求不断增加,需要强大而可靠的通信系统。正如本系列第一部分所述,这些应用涵盖从秒到毫秒的广泛响应时间要求,它们的成功通常取决于其响应的精确时间。因此,所选的通信系统必须能够满足这些严格的时序限制…

游戏门户网站模板建设银行网站查询密码

目录1、使用 Java 来控制 Windows 系统音量,使用 JNA 调用 windows 底层 API 因为有点麻烦,所以这里采用纯 Java API结合 VBS 脚本的方式进行控制。2、可以参考《VBS 控制 Windos 系统音量 及视频播放》,本文同样是利用 VBS 来控制&#xff0…

莱芜关于网站建设的公司北京制作网站的公司简介

path模块 path 模块提供了 操作路径 的功能,将介绍如下几个较为常用的几个 API: API说明path.resolve拼接规范的绝对路径 常用path.sep获取操作系统的路径分隔符path.parse解析路径并返回对象path.basename获取路径的基础名称path.dirname获取路径的目…

网站备案升级如何做网站后台管理

本章主要说一下模拟实现string类的部分功能,文章末附上所有代码。 目录 一、构造函数与析构函数 二、拷贝构造 三、c_str 四、【】和迭代器的遍历与访问 五、size 六、判断 七、reserve 八、push_back 九、resize 十、append 十一、 十二、insert 十…

高端企业网站建设服务商qq音乐的网站建设信息

你们知道在W7中怎么设置鼠标的滚轮吗?下面是小编带来的关于win7如何设置鼠标滚轮的内容,欢迎阅读!Win7设置滚轮方法一:首先要在电脑的左下角点击开始按钮点击开始按钮以后出现上拉菜单,在菜单上面点击控制面板点击控制面板以后进入到控制面板…

简述网站建设流程网站开发项目规划书

hdvp:外部函数文件,函数定义在hdvp中可以传输给任何hdev使用,即可以发给别人使用。同时允许对hdvp进行加密

东莞网站建设工作室我要用新浪云做网站

引言 记录一次线上redis占用过大的排查过程,供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆,同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆,于是首先去查看了登陆功能的报错…

龙岗网站-建设深圳信科工程建设室内涂料招投标网站

引言 分布式系统中的多个节点经常需要对共享资源进行并发访问,若没有有效的协调机制,可能会导致数据竞争、资源冲突等问题。分布式锁应运而生,它是一种保证在分布式环境中多个节点可以安全地访问共享资源的机制。而在Redis中,使用…

免费下载软件的网站有哪些wordpress s3插件

最近要做一个应用要实现本地化,因为使用的是xcode4,应用程序本地化的问题跟以前的版本还是有些不同,在网上找了些资料对于xcode4以上的版本资料还是相对较少,有些最后要通过手动创建文件,这样操作实在是太麻烦&#xf…

给别人做网站前要问些什么问题湛江市品牌网站建设怎么样

随着网络技术的发展,网络请求成为了许多应用的重要组成部分。然而,手动发送网络请求不仅效率低下,而且容易出错。为了解决这个问题,我们可以使用Python来实现网络请求的自动化。而HTTP代理可以帮助我们更好地控制和管理这些请求。…

购物网站,购物车界面如何做python网站建设代码

显卡 显卡代号前缀英伟达(NVIDIA)RTX系列实时光线追踪的基本原理DLSS技术的基本原理 显卡代号前缀 前缀品牌首次发布时间定位适用人群主流产品GTNVIDIA2006年较低性能办公用户、轻度游戏GT 1030GTXNVIDIA2008年高性能游戏玩家、图形设计师GTX 1080 TiRT…

vue大型网站怎么做路由什么软件可以攻击网站

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

网站建设广州网站建设南宁网站推广营销

1 为啥会有这个认证 你既然点进来了这个也就不重要了,重要的是怎么拿到他,以SAA-C03为例,从开始到结束我们一起来进行准备 2 考试卷 目前AWS的考试是要交钱的,正常情况下拿到5折劵很容易,比如你之前考过AWS的认证会给…

专业网站设计怎么做想做个小网站怎么做

Codeforces Round #697 (Div. 3)A~G解题报告 题 A Odd Divisor 题目介绍 解题思路 乍一想本题,感觉有点迷迷糊糊,但是证难则反,直接考虑没有奇数因子的情况,即 N 2i2^{i}2i,那么当N ! 2i2^i2i时,就有 奇数因子 注意…

深圳汇鑫科技网站建设有哪些网站是用php做的

一、问题 赋值表达式中可以分为左值和右值,那么什么是左值和右值?数组名做为左右值时又具有怎样的意义? 二、解答 在C语言中,左值和右值的概念对于理解赋值表达式以及程序的正确性非常重要: 1、左值 • 左值是一个…

网站图片装修的热切图怎么做网站微信支付怎么做的

直线度的检测不再局限于直尺法、重力法等人工检测方式,随着自动化的发展,直线度检测也更需要自动化方便快捷的检测仪器。为此,研发了在线直线度测量仪与离线直线度测量仪,根据不同的需要,选择合适的设备即可。 数据计…

基础建设的网站有哪些内容微信网页版登录手机版

本文详解C#串口类SerialPort 目录 一、概述 二、构造函数及重载 三、字段InfiniteTimeout 四、属性 五