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

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

相关文章:

Effective C++学习笔记(8)

目录 条款49&#xff1a;了解new-handler的行为条款50&#xff1a;了解new和delete的合理替换时机条款51&#xff1a;编写new和delete时需固守常规条款52&#xff1a;写了placement new也要写placement delete条款53&#xff1a;不要轻忽编译器的警告条款54&#xff1a;让自己熟…...

学校如何公布录取情况表?这个不用技术的方法,小白老师都能轻松制作

作为一名教师&#xff0c;我深切了解学生和家长们对录取情况的关注和重视。为了满足他们的需求&#xff0c;我们学校一直致力于改进公布录取情况的方式和效果。在本篇文章中&#xff0c;我将向您介绍我们学校独特的录取查询系统&#xff0c;并分享我们选择这种方式的原因。 我…...

Chart GPT免费可用地址共享资源

GPT4.0&#xff1a; https://gpt4e.ninvfeng.xyz github:https://github.com/ninvfeng/chatgpt4 WeUseAi&#xff1a;https://chatb.weuseai.pro AI.LS&#xff1a;https://n7.gpt03.xyz ChatX (iOS/macOS应用)&#xff1a;https://itunes.apple.com/app/id6446304087 ch…...

设计模式十八:中介者模式(Mediator Pattern)

在中介者模式中&#xff0c;多个对象之间不再直接相互通信&#xff0c;而是通过一个中介者对象进行通信。这可以减少对象之间的依赖关系&#xff0c;使系统更加模块化。中介者模式适用于当对象之间的通信逻辑变得复杂&#xff0c;导致代码难以维护和理解时。 中介者模式使用场…...

神经网络基础-神经网络补充概念-12-向量化逻辑回归的梯度输出

代码实现 import numpy as npdef sigmoid(z):return 1 / (1 np.exp(-z))def compute_loss(X, y, theta):m len(y)h sigmoid(X.dot(theta))loss (-1/m) * np.sum(y * np.log(h) (1 - y) * np.log(1 - h))return lossdef compute_gradient(X, y, theta):m len(y)h sigmoi…...

2023-08-16力扣每日一题

链接&#xff1a; 2682. 找出转圈游戏输家 题意&#xff1a; 环形1到n&#xff0c;从1开始&#xff0c;每次移动 第i次*k &#xff0c;当移动到出现过的序号时停下&#xff0c; 求没移动到的数字 解&#xff1a; 简单模拟题&#xff0c;我也以为有数学做法&#xff0c;可…...

耗资170亿美元?三星电子在得克萨斯州建设新的半导体工厂

据报道&#xff0c;三星电子在得克萨斯州泰勒市建设的新的半导体工厂预计将于2024年下半年投入运营。这座工厂将成为三星电子在美国的第二座芯片代工厂&#xff0c;与位于得克萨斯州奥斯汀市的第一座工厂相距不远。 此次投资将耗资约170亿美元&#xff0c;显示了三星电子在半导…...

黑马项目一阶段面试58题 Web14题(一)

一、什么是AJAX 异步的JavaScript和XML。用来做前端和后端的异步请求的技术。 异步请求&#xff1a;只更新部分前端界面的请求&#xff0c;做到局部更新。 比如注册&#xff0c;提示用户名已存在而整个页面没有动 比如百度图片搜索美女&#xff0c;进度条越变越短&#xff…...

多线程与高并发--------线程池

线程池 一、什么是线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可以了。 比如做业务操…...

深度学习实战48-【未来的专家团队】基于AutoCompany模型的自动化企业概念设计与设想

大家好,我是微学AI,今天给大家介绍一下深度学习实战48-【未来的专家团队】基于AutoCompany模型的自动化企业概念设计与设想,文本将介绍AutoCompany模型的概念设计,涵盖了AI智能公司的各个角色,并结合了GPT-4接口来实现各个角色的功能,设置中央控制器,公司运作过程会生成…...

深入剖析:如何通过API优化云计算架构?快来看!

在当今数字化时代&#xff0c;云计算已经成为企业实现创新、提高效率和降低成本的核心策略之一。而在构建和管理云计算架构时&#xff0c;API&#xff08;应用程序编程接口&#xff09;的作用变得愈发重要。本文将深入探讨如何通过API优化云计算架构&#xff0c;实现更高效、灵…...

基于STM32设计的中药分装系统

一、设计需求 基于STM32设计的中药分装系统 【1】项目背景 中药文化是我国文化瑰宝之一,它具有疗效好、副作用小的优点,而且相对于西药,全天然的中药还具有标本兼治的特点,不仅可以用来治病,更可以对患者身体进行调理,所以格外受到当今一直追求生活质量的人们的追捧&quo…...

消息队列学习笔记

消息队列基础 适合消息队列解决的问题 异步处理&#xff1a;处理完关键步骤后直接返回结果&#xff0c;后续放入队列慢慢处理流量控制&#xff1a; 使用消息队列隔离网关和后端服务&#xff0c;以达到流量控制和保护后端服务的目的。能根据下游的处理能力自动调节流量&#x…...

贝锐蒲公英:助力企业打造稳定高效的智能安防监控网络

随着技术的快速发展和物联网的普及&#xff0c;企业面临着许多安全威胁和风险&#xff0c;如盗窃、入侵、信息泄露等&#xff0c;企业需要建立安防监控系统来保护其资产、员工和业务运营的安全。 然而&#xff0c;企业在搭建安防监控系统的过程中&#xff0c;可能会面临一些难…...

SASS 学习笔记

SASS 学习笔记 总共会写两个练手项目&#xff0c;成品在 https://goldenaarcher.com/scss-study 可以看到&#xff0c;代码在 https://github.com/GoldenaArcher/scss-study。 什么是 SASS SASS 是 CSS 预处理&#xff0c;它提供了变量&#xff08;虽然现在 CSS 也提供了&am…...

Web菜鸟教程 - Springboot接入认证授权模块

网络安全的重要性不言而喻&#xff0c;如今早已不是以前随便弄个http请求就能爬到数据的时代&#xff0c;而作为一个架构师&#xff0c;网络安全必须在产品开发之初就考虑好。因为在产品开发的后期&#xff0c;一方面是客户增多&#xff0c;压力变大&#xff0c;可供利用的时间…...

【深入理解ES6】块级作用域绑定

1. var声明及变量提升机制 提升&#xff08;Hoisting&#xff09;机制&#xff1a;通过关键字var声明的变量&#xff0c;都会被当成在当前作用域顶部生命的变量。 function getValue(condition){if(condition){var value "blue";console.log(value);}else{// 此处…...

使用fake为数据库生成随机数据

参考https://cloud.tencent.com/developer/article/1663417 增加了自己的代码&#xff0c;使得只需要构建内容映射字典&#xff0c;然后根据字典就可以直接将数据插入到数据库中 from faker import Faker import pandas as pd from urllib import parse # from pymongo import…...

树结构转List

使用LinkedList效率更高 1、单个顶级节点 public static List<CmsStudentOutline> getTreeList(CmsStudentOutline root) {List<CmsStudentOutline> list new ArrayList<>();Queue<CmsStudentOutline> queue new LinkedList<>();if (root nu…...

Android复习(Android基础-四大组件)——Broadcast

1. 广播分类 广播的发送方式&#xff1a;标准广播、有序广播、粘性广播广播的类型&#xff1a;系统广播、本地广播 1.1 标准广播 完全异步&#xff0c;无序的广播发出后&#xff0c;所有的广播接收器几乎都会在同一时间收到消息。&#xff08;异步&#xff09;但是消息无法截…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...