《Effective C++》知识点(8)--定制new和delete

49. 了解new-handler的行为

    49.1 set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用。

    49.2 一个设计良好的new-handler函数必须:

           a.  让更多内存可被使用(程序一开始分配一大块内存)。

           b. 安装另一个new-handler。做法之一是令new-handler修改"会影响new-handler行为"的

               static数据、namespace数据或global数据。

           c. 卸除new-handler。将null指针传给set_new_handler,内存分配不成功时抛出异常。

           d. 抛出bad_alloc(或派生自bad_alloc)的异常(不被operator new捕捉)。

           e. 不返回。通常调用abort或exit。

    49.3 Nothrow new是一个颇为局限的工具,因为它只适用于内存分配,后继的构造函数调用还

            是可能抛出异常。  

    49.4 CRTP(curiously recurring template pattern)奇异递归模板模式

            一个类X继承自一个模板化的基类A,而A 又以X作为类型参数。CRTP可以被用于实现编译

            期多态(静态多态),其中基类A用来定义(暴露)接口,派生类X用来实现这些接口。

50. 了解new和delete的合理替换时机

      为什么会需要替换编译器提供的operator new或operator delete?

         a. 用来检测运用上的错误。数据"overruns"(写入点在分配区块尾端之后)或"underruns"(写入

             点在分配区块起点之前)。自定义new可以超额分配内存,以额外的空间放置特定的byte

             patterns(即签名signatures)。自定义delete则可以检查签名是否正确,若否则表示在分配

             区的某个时间点发生了overrun或underrun,此时可以log事件。

         b. 为了收集使用上的统计数据。

         c. 为了增加分配和归还的速度(强化效能)。定制版的new和delete比缺省版本更快。

         d. 为了降低缺省内存管理器带来的空间额外开销(强化效能)。定制版的new和delete比缺省版

             本更省空间。   

         e. 为了弥补缺省分配器中的非最佳齐位。如new时保证8-byte齐位。

          f. 为了将相关对象成簇集中。构建单独的heap,将数据集中在尽可能少的内存页。

         g. 为了获得非传统的行为。如包装C API,delete时擦除内容等。

51. 编写new和delete时需固守常规

    51.1 自定义operator new

         a. 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就应该调用

              new-handler。

         b. 应该有能力处理0 byte申请(视为1 byte申请)。

         c. 类的专属版本应该能处理"与正确大小不一致的(错误)"申请(交给标准operator new)。

    51.2 自定义operator delete

         a. 应该在收到null指针时不做任何事。

         b. 类的专属版本应该能处理"与正确大小不一致的(错误)"申请(交给标准operator delete)。

52. 写了placement new也要写placement delete

     如果operator new接受的参数除了一定会有的size_t之外还有其它,这就是placement new。

    52.1 当你写了一个placement new,确保也写了对应的placement delete。如果没有这样做,你的程序可能会发生隐藏的内存泄漏。

    52.2 当你声明placement new和placement delete,请确保没有掩盖它们的正常版本(条款33)。

          缺省情况下,global作用域的operator new:

          a. void* operator new(std::size_t) throw(std::bad_alloc); //normal new

          b. void* operator new(std::size_t,void*) throw(); //placement new

          c. void* operator new(std::size_t,const std::nothrow_t&) throw();//placement new

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

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

相关文章

1000道精心打磨的计算机考研题,408小伙伴不可错过

提示:408考研人看过来,超精选计算机考研1000题! 文章目录 前言1. 为什么是1000题?2. 有什么优势?【练学结合,助力强化】【难度适中,但不刁钻】【题目新颖,独具匠心】【考题预测&…

Minio

Minio学习 MinioMinio介绍安装window安装1.下载服务端和客户端文件[地址](https://min.io/download#/windows)2.创建minio相关目录3.启动minio服务方式一方式二4.查看minio版本5.访问minio控制台 linux安装docker安装 Minio Minio介绍 MinIO 是在 Apache License v2.0 下发布…

17. 机器学习——SVM

机器学习面试题汇总与解析——SVM 本章讲解知识点 什么是 SVMSVM 的基本原理线性不可分 SVM非线性 SVMSVM 优缺点本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。 本专栏针对面试题答案进行了优化…

云课五分钟的一些想法

起源 自中学起,就积极学习和掌握互联网相关知识,到如今已经快30年了。 个人也全程经历了从信息时代的互联网(硬)到智能时代的大模型(软)。 整体信息到智能的基础设施,由硬到软,机…

安装表面应变计的方法及注意事项

安装表面应变计的方法及注意事项 表面应变计被广泛用于水利工程和混凝土结构中,用于测量埋设点的线性变形(应变)和应力,同时也可以测量温度。它们可以分为表面安装式和埋入式两种。 一、埋入式表面应变计 1、混凝土应变计的安装…

19. 机器学习——朴素贝叶斯

机器学习面试题汇总与解析——朴素贝叶斯 本章讲解知识点 什么是朴素贝叶斯本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份…

蓝桥杯每日一题2023.11.13

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 由于每次吹灭的蜡烛与年龄相同故我们想到使用前缀和可以让我们求出各个区间的和,我们将每个区间都枚举一遍,如果符合要求就输出区间开始的位置(答案&#xff…

程序员的奔溃与欢笑:分享一些编程中的搞笑故事

程序员是一群勤奋、智慧、创造力的人,他们用代码构建了我们日常使用的各种软件、应用、网站和游戏。但是,程序员的工作并不总是一帆风顺,有时候他们也会遇到一些让人奔溃的情况,比如隐藏的错误、复杂的bug、意外的结果等等。这些情…

精通Nginx(11)-缓存

缓存能够存储请求的响应结果,以供未来再次使用,进而加速内容的提供。内容缓存可以缓存完整的响应,减少上游服务器的负载,避免了每次都为相同的请求重新运行计算和查询的麻烦。缓存可以提高性能并减少负载,这意味着可以用更少的资源更快地提供服务。NGINX 允许在NGINX 服务…

C语言—i++、++i、条件运算符、goto语句、注释

i和i #include <stdio.h> int main() {int i5,j;j i;printf("i%d,j%d\n", i, j);i 5;j i;printf("i%d,j%d\n", i, j);system("pause");return 0;}i6,j6 i6,j5 请按任意键继续. . .条件运算符 goto语句 #include <stdio.h> int …

Ansible自动化部署工具-role模式安装filebeat实际案例分析

大家好&#xff0c;我是蓝胖子&#xff0c;前面一节我简单的讲了讲Ansible的架构和编排任务的语法&#xff0c;可以发现&#xff0c;通过playbook方式编排任务时&#xff0c;能够将任务文档化&#xff0c;但是在面对比较复杂且不同业务的任务编排时&#xff0c;维护playbook就变…

SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;SpringIOC和DI的代码实现&#xff0c;Spring如何存取对象&#xff1f;Controller、Service、Repository、Component、Configuration、Bean DI详…

若依框架下载文件

若依下载的逻辑是指定文件存储的路径&#xff0c;在ruoyi-admin模块下的application.yml中配置路径结尾必须要加/或者\结尾。 他使用的是虚拟路径映射&#xff0c;所以文件名必须是配置路径下真实的文件名。 若依采用的是流的方式&#xff0c;前端必须要用bolb的方式去接收&am…

怎么在uni-app中使用Vuex 简单demo,通俗易懂(第二篇)

Vuex是Vue.js的官方状态管理库&#xff0c;可以帮助我们更好地管理和维护复杂状态和数据共享。在Vuex中&#xff0c;整个应用的状态被集中到一个单一的状态树中&#xff0c;这个状态树包含了所有的共享状态和数据。通过状态管理模块、getter、mutation、action等机制&#xff0…

四入进博会,优衣库围绕科技可持续演绎“服装进化论”

11月5日&#xff0c;第六届中国国际进口博览会在上海拉开帷幕。这些年来&#xff0c;进博巨大的平台效应&#xff0c;使其成为各个行业头部品牌的秀场&#xff0c;也持续为消费者、产业链带来惊喜。 今年&#xff0c;也是全球服装界科技知名品牌——优衣库的第四次进博之旅。从…

esp32-rust-std-examples-blinky

以下为在 ESP-IDF (FreeRTOS) 上运行的 blinky 示例&#xff1a; https://github.com/esp-rs/esp-idf-hal/blob/master/examples/blinky.rs //! Blinks an LED //! //! This assumes that a LED is connected to GPIO4. //! Depending on your target and the board you are …

Node-RED系列教程-28修改UI默认背景图片

主要使用到如下节点: 实现过程如下: 步骤1:编写背景图片请求服务. http in节点配置: 读文件节点配置: http out节点配置: 到此,背景图片请求服务搭建完成。

Uniapp实现时间选择器

Uniapp是一款基于Vue.js开发的跨平台应用框架&#xff0c;可以快速构建多端的移动应用。要在Uniapp中实现时间选择器&#xff0c;可以借助uni-datetime-picker组件来完成。 步骤 以下是在Uniapp中实现时间选择器的步骤&#xff1a; 在需要使用时间选择器的页面中引入 uni-date…

vue3 自动导入composition-apiI和组件

1.api的自动导入 常规写法&#xff1a; <script setup>import { ref, reactive, onMounted, computed ,watch } from vue;import { useRouter } from "vue-router";const router useRouter();const person reactive ({name&#xff1a;张三&#xff0c;age…

RT-DETR算法改进:最新Inner-IoU损失函数,辅助边界框回归的IoU损失,提升RT-DETR检测器精度

💡本篇内容:RT-DETR算法改进:最新Inner-IoU损失函数,辅助边界框回归的IoU损失,提升RT-DETR检测器精度 💡本博客 改进源代码改进 适用于 RT-DETR目标检测算法(ultralytics项目版本) 按步骤操作运行改进后的代码即可🚀🚀🚀 💡改进 RT-DETR 目标检测算法专属…