C++ 侯捷 内存管理

C++ 的内存获取机制:

void* p1 = malloc(512);
free(p1);

complex<int>* p2 = new complex<int>;
delete p2;

void* p3 = ::operator new(512);
::operator delete(p3);

//GNUC
void* p4 = alloc::allocate(512);
alloc::deallocate(p4, 512);

//GNUC4.9
void* p5 = allocator<int>().allocate(7); //分配7个int
allocator<int>().deallocate((int*)p5, 7);

表达式 new delete

new的步骤:

  1. 申请一段指定类大小的空间:new —> operator new —> malloc
  2. 转化为对应类类型
  3. 调用类构造函数

在operator new的源码中,有个std::nothrow_t& _THROW0()参数,表示这个函数不抛异常,取而代之的是返回一个空指针,用户通过判断是否为空指针来判断是否分配成功。

array new、array delete

array new是分配一个对象数组,通常容易犯得一个错误是在delete的时候忘记在delete后面加[]导致内存泄漏的问题。

replacement new

允许我们将对象分配在已经构建的内存中

他不会进行内存分配,而是调用重载的operator new,用于返回已经分配好的内存,转型、调用构造函数。

#include<new>
char* buf = new char[sizeof(Complex)* 3];
Complex* pc = new(buf) Complex(1, 2); // replacement new!!!
Complex* pc = new Complex(1, 2); 

函数operator new()、operator delete()

重载::operator new / ::operator delete

全局重载:

inline void* operator new(size_t size){
	cout << "global new() " << endl;
	return malloc(size);
}

inline void* operator new[](size_t size){
	cout << "global new[]() " << endl;
	return malloc(size);
}

在类中重载::operator new / ::operator delete更有用(array new / array delete重载也是一样的方法):

 

我们重载这两个函数,是为了接管内存分配的工作,接管它了有什么用呢?很有用,比如说可以做一个内存池(这个就是之前讲STL的时候的__pool_allocator)

为什么重载的operator new是static呢?因为希望实现的这个内存池是这个类的所有对象都能使用的!

我们可以重载operator new()的前提是:每一个版本的声明都必须有独特的参数列,其中第一个参数必须是size_t,其余参数以new所制定的replacement arguments为初值。

只有在上述的重载replacement new抛出异常的时候,才会调用相应的operator delete(这个需要自己去实现),因为在重载replacement new抛出异常,那么说明内存分配不成功,但是可能已经申请好内存,那么我们应该去处理申请好的这个内存。

static allocator

new handler

 

=default   =delete

delete 我不要,default  使用默认的版本

std::allocator

参考文章:侯捷C++八部曲笔记(五、内存管理)_侯捷内存管理-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【经验分享】日常开发中的故障排查经验分享(一)

目录 简介CPU飙高问题1、使用JVM命令排查CPU飙升100%问题2、使用Arthas的方式定位CPU飙升问题3、Java项目导致CPU飙升的原因有哪些&#xff1f;如何解决&#xff1f; OOM问题&#xff08;内存溢出&#xff09;1、如何定位OOM问题&#xff1f;2、OOM问题产生原因 死锁问题的定位…

SQL Server 存储过程 触发器 事务处理

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * CSDN 成就一亿技术人&#xff01; 目录 1. 存储过程的作用 创建存储过程 2. 触发器 触发器的种类 insert触发器 update触发器 delete触发器 测试 3. 事务 开始事务 提交事务 回滚事务 举个实例 在 SQ…

深度学习在自然语言处理中的应用

深度学习在自然语言处理中的应用 一、引言 随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;作为其重要分支&#xff0c;已经在诸多领域取得了令人瞩目的成果。深度学习作为当前最炙手可热的技术&#xff0c;为NLP带来了革命性的变革。本文将…

红队打靶练习:MISDIRECTION: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

【计算机毕业设计】SSM在线宿舍管理系统

项目介绍 本项目包含管理员、宿舍管理员、学生三种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,院系管理,专业管理,年级管理,班级管理,学生设置,宿舍管理员管理,宿舍楼管理,宿舍管理,床位管理,学生入住登记,学生退房管理等功能。 宿舍管理员角色包含以…

如何在 Linux 中配置 firewalld 规则

什么是FirewallD “firewalld”是firewall daemon。它提供了一个动态管理的防火墙&#xff0c;带有一个非常强大的过滤系统&#xff0c;称为 Netfilter&#xff0c;由 Linux 内核提供。 FirewallD 使用zones和services的概念&#xff0c;而 iptables 使用chain和rules。与 ip…

LabVIEW的便携式车辆振动测试分析

随着计算机和软件技术的发展&#xff0c;虚拟仪器正逐渐成为机械工业测试领域的主流。在现代机械工程中&#xff0c;特别是车辆振动测试&#xff0c;传统的测试方法不仅设备繁杂、成本高昂&#xff0c;而且操作复杂。为解决这些问题&#xff0c;开发了一款基于美国国家仪器公司…

【React】echarts-for-react 的使用

文章目录 echarts-for-react &#xff1a;一个简单的 Apache echarts 的 React 封装配置项手册&#xff1a;https://echarts.apache.org/zh/option.html#title 安装依赖 $ npm install --save echarts-for-react# echarts 是 echarts-for-react的对等依赖,您可以使用自己的版本…

新能源汽车冷却系统的水道管口类型有哪些?格雷希尔针对这些管口密封的快速接头有哪些?

对于新能源汽车&#xff0c;不仅电池&#xff0c;还有电机、电控、充电单元部件&#xff0c;都需要处于适宜的工作温度&#xff0c;才能维持整车的正常运行。而这些部件在运行过程中会产生大量的热量&#xff0c;如果不及时散热会对汽车的性能、寿命产生影响&#xff0c;甚至可…

基于ssm西安旅游管理系统论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对西安旅游信息管理的提升&#x…

基于element-ui table组件的二次封装

文章目录 配置数据基础分析封装 el-table-column使用插槽强化结语 相信 element-ui 大家都有所耳闻&#xff0c;table 也是老朋友了&#xff0c;不过有没有在使用他的时候&#xff0c;大家是怎么使用的呢&#xff1f;是直接在官网上cv使用吗&#xff1f;这种方式&#xff0c;我…

2023启示录丨自动驾驶这一年

图片&#xff5c;《老人与海》插图 过去的20年&#xff0c;都没有2023年如此动荡。 大模型犹如一颗原子弹投入科技圈&#xff0c;卷起万里尘沙&#xff0c;传统模式瞬间被夷为平地&#xff0c;在耀眼的白光和巨大的轰鸣声之下&#xff0c;大公司、创业者、投资人甚至是每一位观…

裕泰微YT8521SH PHY芯片在uboot下的代码适配(一)

文章目录 支持的工作模式自协商模式下改变 PHY 支持的速度和双工能力 RGMII 配置通过 POS 设置 RX_delay通过寄存器加长 RX_delayTX_delay 的设置驱动能力的设置 LED 灯配置硬件电路设计相关问题快速上下电的要求上电复位时序要求 YT8521SC/SH 是一款单口千兆以太网 PHY。 支持…

OSPF ROUTER-ID-新版(15)

目录 整体拓扑 操作步骤 1.INT 验证Router-ID选举规则 1.1 查看路由器Router-ID 1.2 配置R1地址 1.3 查看R1接口信息 1.4 查看R1Router-ID 1.5 删除接口IP并查看Router-ID 1.6 手工配置Router-ID 2.基本配置 2.1 配置R1的IP 2.2 配置R2的IP 2.3 配置R3的IP 2.4 配…

数据库管理-第128期 2023总结(202301229)

数据库管理-第128期 2023总结&#xff08;202301229&#xff09; 到了2023年的最后一个工作日&#xff0c;也该对即将过去的2023年做一个小小的总结&#xff1a; 1 写文章 2023年在CSDN总共写了82篇文章。 2023年4月开始在墨天轮写文章&#xff0c;总共写了75篇文章&#xf…

电子工程师如何接私活赚外快?

对电子工程师来说&#xff0c;利用业余时间接私活是个很常见的技术&#xff0c;不仅可以赚取额外收入&#xff0c;也能提升巩固技术&#xff0c;可以说国内十个工程师&#xff0c;必有五个在接私活养家糊口&#xff0c;如果第一次接私活&#xff0c;该如何做&#xff1f; 很多工…

基于Springboot+vue医院管理系统(前后端分离)

最近有一些读者问我有没有完整的基于SpringbootVue的项目源码&#xff0c;今天给大家整理了一下&#xff0c;无偿分享给大家。 功能&#xff1a; 医生信息管理 换着信息管理 挂号信息管理 药物信息管理 检查项目管理 病床信息管理 排班信息管理 数据统计分析 开发工具…

基于低代码的指尖遐想_1

解决问题或分析事务的思考方法&#xff1a; 1、什么是低代码&#xff0c;或者说现在的低代码能做什么&#xff0c;未来能做什么&#xff0c;其存在的合理性是什么&#xff1f; 回答这个问题的本质是搜集信息&#xff0c;公开的或非公开的。 答&#xff1a;低代码主要分为广义…

视频号三年:质疑红利,理解红利,抄底红利

“去年刚进来时&#xff0c;视频号带货配套都还不成熟&#xff0c;团队都不熟悉后台操作&#xff0c;硬是磨合了一个多月&#xff0c;也做好了亏钱的准备。不过前两天刚算了帐&#xff0c;今年 GMV 已经比去年翻了两番。” “22年想靠投流起号&#xff0c;但每次投流计划基本消…

地震烈度速报与预警工程成功案例的经验分享 | TDengine 技术培训班第一期成功落地

近日&#xff0c;涛思数据在成都开设了“国家地震烈度速报与预警工程数据库 TDengine、消息中间件 TMQ 技术培训班”&#xff0c;这次培训活动共分为三期&#xff0c;而本次活动是第一期。其目标是帮助参与者深入了解 TDengine 和 TMQ 的技术特点和应用场景&#xff0c;并学习如…