Effective C++学习笔记(8)

目录

  • 条款49:了解new-handler的行为
  • 条款50:了解new和delete的合理替换时机
  • 条款51:编写new和delete时需固守常规
  • 条款52:写了placement new也要写placement delete
  • 条款53:不要轻忽编译器的警告
  • 条款54:让自己熟悉包括TR1在内的标准程序库
  • 条款55:让自己熟悉Boost

条款49:了解new-handler的行为

  • 当operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数newhandler
  • set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用。set_ new_handler 的参数是个指针,指向operator new无法分配足够内存时该被调用的函数。其返回值也是个指针,指向set_new_handler被调用前正在执行(但马上要被输入参数替换)的那个new_handler。
    在这里插入图片描述
  • Nothrow new是一个颇为局限的工具,因为它只适用于内存分配(保证在operator new内存分配时不跑出异常),但后继的造函数调用还是可能抛出异常
  • 以下模板可为任何类Class添加set_ new_handler支持,只需要Class继承NewHandlerSurpport<Class>。在模板类NewHandlerSurpport中,模板参数T其实并未使用,这是为了保证每个继承类拥有各自实体互异的NewHandlerSurpport复件。
    在这里插入图片描述
    在这里插入图片描述

条款50:了解new和delete的合理替换时机

  • 有许多理由需要写个自定的new和delete,包括改善效能(内存地址对齐原则,处理小块内存问题等等)、对heap运用错误进行调试、收集heap使用信息。

条款51:编写new和delete时需固守常规

  • operator new应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler。它也应该有能力处理0 bytes 申请。对象的大小不可能为0 byte,至少为1 byte。
    在这里插入图片描述

  • Class 专属版本则还应该处理“比正确大小更大的(错误)申请”,例如派生类继承了基类的new操作,通常情况下派生类对象占用内存大小要大于基类对象。
    在这里插入图片描述

  • operator delete应该在收到null指针时不做任何事。
    在这里插入图片描述

  • 万一class专属的operator new将大小有误的分配行为转交给标准::operator new执行,你也必须将大小有误的删除行为转交::operator delete 执行。
    在这里插入图片描述

条款52:写了placement new也要写placement delete

  • 当new一个对象时,第一步调用分配内存的operator new,第二步调用对象类的构造函数。如果第一步调用成功,但在第二步抛出异常,步骤一中的内存分配必须取消并恢复旧观,否则就会造成内存泄漏。在取消内存分配并恢复旧观的过程中,会调用与第一步中new对应的delete操作。正常签名式的new对应正常签名式的delete;placement operator new对应placement operator delete(伴随placement operator new调用而触发构造函数异常时被调用)。如果程序中只有非对应其中各一个,则系统将无法找到调用的函数进行恢复,如下例。
    在这里插入图片描述

  • 如果要对所有与placement new相关的内存泄漏宣战,我们必须同时提供一个正常的operator delete(用于构造期间无任何异常被抛出)和一个placement版本(用于构造期间有异常被抛出)。后者的额外参数必须和operator new一样。
    在这里插入图片描述

  • 当你声明placement new和placement delete,请确定不要无意识(非故意)地遮掩了它们的正常版本。缺省情况下C++在global作用域内提供以下形式的operator new:
    在这里插入图片描述
    如果你在class内声明任何operator news,它会遮掩上述这些标准形式。

  • 想要扩展自定义的palcement new and delete,又想避免全局和基类的new delete被掩盖,可建立一个base class,内含所有正常形式的new和delete,凡是想以自定形式扩充标准形式的客户,可利用继承机制及using声明式,如下:
    在这里插入图片描述
    在这里插入图片描述

条款53:不要轻忽编译器的警告

  • 严肃对待编译器发出的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉。
  • 不要过度倚赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失。

条款54:让自己熟悉包括TR1在内的标准程序库

  • STL库

条款55:让自己熟悉Boost

  • Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程序库开发。Boost 在C++标准化过程中扮演深具影响力的角色。Boost提供许多TR1组件实现品,以及其他许多程序库。
  • https://www.boost.org

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

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

相关文章

智能楼宇综合布线实训室建设方案

一、楼宇智能综合布线实训室方案概述 楼宇智能综合布线实训室方案旨在为学生提供一个真实的学习和实践环境&#xff0c;以培养他们在楼宇智能综合布线领域的实际操作能力和技能。以下是一个概述&#xff1a; 1. 培养目标&#xff1a;培养学生在楼宇智能综合布线方面的综合能力…

LeetCode150道面试经典题-- 环形链表(简单)

1.题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&…

React2023电商项目实战 - 1.项目搭建

古人学问无遗力&#xff0c;少壮工夫老始成。 纸上得来终觉浅&#xff0c;绝知此事要躬行。 —— 陆游《《冬夜读书示子聿》》 系列文章目录 项目搭建App登录及网关App文章自媒体平台&#xff08;博主后台&#xff09;内容审核(自动) 文章目录 系列文章目录一、项目介绍1.页面…

Smartbi 李代:人尽其才、数尽其用,Smartbi Eagle智慧数据运营平台全新亮相

数据是企业数字化转型的基石&#xff0c;也是赢得未来的核心资产和竞争力。数字化转型的关键&#xff0c;是在全公司建立一种数据驱动的组织和机制&#xff0c;营造数据文化的氛围&#xff0c;让更多的用户、在更多的场景中&#xff0c;有意愿、有能力使用数据&#xff0c;从而…

ssm+vue基于java的健身房管理系统源码和论文PPT

ssmvue基于java的健身房管理系统源码和论文PPT015 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统…

手机出现 不读卡 / 无信号时应该怎么办?

当手机屏幕亮起&#xff0c;一般在屏幕最上方都会有代表手机卡状态的显示&#xff0c;其中网络信号和读卡状态的标识&#xff0c;依旧有很多人分不太清&#xff0c;更不清楚改怎么办了。 1、当我们的手机里有两张卡时&#xff0c;则会有两个信号显示 2、信号状态一般是由短到…

什么是合成数据(Synthetic Data)?

关于合成数据您需要知道的一切 推出人工智能&#xff08;AI&#xff09;的企业在为其模型采集足够的数据方面会遇到一个主要障碍。对于许多用例来说&#xff0c;正确的数据根本不可用&#xff0c;或者获取数据非常困难且成本高昂。在创建AI模型时&#xff0c;数据缺失或不完整…

人尽其才、数尽其用,Smartbi Eagle智慧数据运营平台全新亮相

数据是企业数字化转型的基石&#xff0c;也是赢得未来的核心资产和竞争力。数字化转型的关键&#xff0c;是在全公司建立一种数据驱动的组织和机制&#xff0c;营造数据文化的氛围&#xff0c;让更多的用户、在更多的场景中&#xff0c;有意愿、有能力使用数据&#xff0c;从而…

Android设备通过蓝牙HID技术模拟键盘实现

目录 一&#xff0c;背景介绍 二&#xff0c;技术方案 2.1 获取BluetoothHidDevice实例 2.2 注册/解除注册HID实例 2.3 Hid report description描述符生成工具 2.4 键盘映射表 2.5 通过HID发送键盘事件 三&#xff0c;实例 一&#xff0c;背景介绍 日常生活中&#xff0…

面试热题(单词搜索)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相…

【100天精通python】Day37:GUI界面编程_PyQT从入门到实战(上)

目录 专栏导读 1 PyQt6 简介&#xff1a; 1.1 安装 PyQt6 和相关工具&#xff1a; 1.2 PyQt6 基础知识&#xff1a; 1.2.1 Qt 的基本概念和组件&#xff1a; 1.2.2 创建和使用 Qt 窗口、标签、按钮等基本组件 1.2.3 布局管理器&#xff1a;垂直布局、水平布局、网格布局…

记一次前端直接上传图片到oss报错

前端直接上传图片到阿里云oss,相关过程官网和网上资料已经很详细&#xff0c;不做赘述。 但这个过程比较复杂&#xff0c;前后端对接过程中很容易出现报错&#xff0c;这里遇到了以下报错&#xff0c;不容易排查。 请求显示net::ERR_NAME_NOT_RESOLVED错误&#xff0c;catch输…

题目:售货员的难题(状压dp)

售货员的难题 题目描述输入输出格式输入格式&#xff1a;输出格式&#xff1a; 输入输出样例输入样例#1&#xff1a;输出样例#1&#xff1a; 思路AC代码&#xff1a; 题目描述 某乡有n个村庄( 1 < n < 16 )&#xff0c;有一个售货员&#xff0c;他要到各个村庄去售货&am…

【LangChain】P0 LangChain 是什么与准备工作

LangChain 是什么与准备工作 LangChain 是什么&#xff1f;所谓增强数据感知所谓与环境互动 Get Started下载安装 langchain下载安装 openai获取 OpenAI API Key通过名为 openai_api_key 的参数传递密钥 LangChain 是什么&#xff1f; LangChain 是一个利用语言模型开发应用程序…

也许你正处于《孤注一掷》中的“团队”,要留心了

看完这部电影&#xff0c;心情久久不能平静&#xff0c;想了很多&#xff0c;倒不是担心自己哪天也成为“消失的yaozi”&#xff0c;而是在想&#xff0c;我们每天所赖以生存的工作&#xff0c;跟电影里他们的工作比&#xff0c;差别在哪里呢&#xff1f; 目录 1. 产品的本质…

ElementUI 树形表格的使用以及表单嵌套树形表格的校验问题等汇总

目录 一、树形表格如何添加序号体现层级关系 二、树形表格展开收缩图标位置放置&#xff0c;设置指定列 三、表单嵌套树形表格的校验问题以及如何给校验rules传参 普通表格绑定如下&#xff1a;这种方法只能校验表格的第一层&#xff0c;树形需要递归设置子级节点prop。 树…

【0基础入门Python笔记】python 之基础语法、基础数据类型、复合数据类型及基本操作

python 基础&#xff08;一&#xff09; 基础语法规则基础数据类型数字类型&#xff08;Numbers&#xff09;字符串类型&#xff08;String&#xff09;布尔类型&#xff08;Boolean&#xff09; 复合数据类型List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff0…

Vue CLI创建Vue项目详细步骤

&#x1f680; 一、安装Node环境&#xff08;建议使用LTS版本&#xff09; 在开始之前&#xff0c;请确保您已经安装了Node.js环境。您可以从Node.js官方网站下载LTS版本&#xff0c;以确保稳定性和兼容性。 中文官网下载 确认已安装 Node.js。可以在终端中运行 node -v 命令…

【mysql报错解决】MySql.Data.MySqlClient.MySqlException (0x80004005)或1366

场景&#xff1a;c#使用mysql数据库执行数据库迁移&#xff0c;使用了新增inserter的语句&#xff0c;然后报错 报错如下&#xff1a; 1.MySql.Data.MySqlClient.MySqlException (0x80004005): Incorrect string value: ‘\xE6\x9B\xB4\xE6\x94\xB9…’ for column ‘Migratio…

Sigmastar SSC8826Q 2K行车记录仪解决方案

一、方案描述 行车记录仪是智能辅助汽车驾驶&#xff0c;和管理行车生活的车联网智能终端设备&#xff0c;利用智能芯片处理器、GPS定位、网络通信、自动控制等技术&#xff0c;将与行车生活有关的各项数据有机地结合在一起。 行车记录仪如今已经成了必不可少的车载用品之一&…