五、C++内存管理机制 —— primitives(侯捷)

news2024/11/26 4:48:14

侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! !
一、C++ 面向对象高级开发
1、C++面向对象高级编程(上)
2、C++面向对象高级编程(下)
二、STL 标准库和泛型编程
1、分配器、序列式容器
2、关联式容器
3、迭代器、 算法、仿函数
4、适配器、补充
三、C++ 设计模式
四、C++ 新标准
五、C++ 内存管理机制
1、primitives
2、malloc/free
3、std::allocator
4、other allocators
5、loki::allocator
六、C++ 程序的生前和死后

五、C++内存管理机制 —— 基础工具 primitives(侯捷)

  • new、delete 表达式
    • 基本用法
    • array new、array delete
    • placement new

👉 该课程能让你:从平地到万丈高楼!—— 侯捷
👉 做到:心中自有丘壑!
💪 源码之前,了无秘密!

所有内存管理的最终动作都要跑到malloc去,所以malloc的效率至关重要。

  • 即,最高阶是使用STL中的内存分配器,而STL的内存分配器实现是通过newnew[]new()等较为低阶的函数,但终归会到mallocfree这两种C函数上来!
  • 一般不会到最下面操作系统层次,不然程序不具有可移植性!

C++内存使用途径:
在这里插入图片描述

C++内存分配的基本工具如下:
在这里插入图片描述
🏃 四个层面使用栗子:

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

complex<int>* p2 = new complex<int>; //one object
delete p2;

void* p3 = ::operator new(512);  //512 bytes (低层就是调用malloc)
::operator delete(p3); //(低层就是调用free)

//以下使用C++ 标准库提供的allocators。
//GNUC2.9  (以下函数为static,定要通过object调用)
void* p4 = alloc::allocate(512);//分配512bytes
alloc::deallocate(p4, 512);

//GNUC4.9  (以下函数为non-static,定要通过object调用)
void* p5 = allocator<int>().allocate(5); //分配5个int
allocator<int>().deallocate((int*)p5, 5);//归还个数也要告诉它

new、delete 表达式

基本用法

⭐️ new的过程分为三步:

  1. 分配内存(指定类大小的空间):new->operator new->malloc
  2. 将指针转化为对应的类类型
  3. 通过指针调用构造函数

在这里插入图片描述
在上图右上角operator new的源码中:

  • malloc没有成功时(一般很少出现),会调用你设定的函数new handler, 在这里面释放可以释放的内存,然后再调用malloc看是否成功;
  • std::nothrow_t& _THROW0()参数,表示这个函数不抛异常,取而代之的是返回一个空指针,用户通过判断是否为空指针来判断是否分配成功。

⭐️ delete的过程:

  1. 先调用析构函数,对象本身的内存就会被释放掉,对象也就死亡了;
  2. 然后释放内存delete -> operator delete -> free

在这里插入图片描述

构造函数不能被直接调用,析构函数可以被直接调用!

在这里插入图片描述

array new、array delete

⭐️ array new是分配一个对象数组:

  • 通常容易犯得一个错误是在delete的时候忘记在delete后面加 []导致内存泄漏的问题

在这里插入图片描述

正如上图所说的:

  • 对于类中没有指针的类,不加 [] 可能问题不大,因为没有指针的类析构函数本来也就没有什么大的作用;
  • 但是,如果有指针,忘记写 [] ,那么 delete 只会触发一次析构函数delete掉一个指针指向的内存,其他指针指向的内存就会泄露。
    • 如上图的 psa 析构,str2str3指向的地址会发生内存泄漏(析构的顺序依编译器而定)。

使用例子:

在这里插入图片描述

没有办法直接调用构造函数设初值,只能绕个弯使用placement new来设初值,形式如下:

//定点的new
new(tem)A(i);			//tem是一个指针

下面两张图分别表示有指针没指针的对象数组分配内存的区别:

在这里插入图片描述
在这里插入图片描述

对于分配一个对象数组,他会把数组的大小也放到存放对象数组的内存块的开头:

  • 如果在delete内存的时候不加 [],编译器会把他当成一个一般的指针,指向一块对象;
  • 它按照一块对象的方式来解析布局,但是存储的是3块,整个布局就乱掉了,就会报错!

placement new

array new调用的是类的默认构造函数,还需要对数组中的对象进行真正的构造,这就需要placement new允许我们将对象分配在已经构建的内存中=。

placement new 就等同于调用构造函数。他不会进行内存分配,具体过程如下:

  1. 调用重载的operator new,和上面的形式不一样,还传入了第二个参数buf定点),用于返回已经分配好的内存;
  2. 转型;
  3. 调用构造函数
    在这里插入图片描述

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

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

相关文章

2023-04-29 动态规划介绍

2023-04-29 动态规划介绍 动态规划是运筹学课程的一部分 多阶段决策问题 有一类活动的过程&#xff0c;可以分成若干个互相联系的阶段&#xff0c;在它的每一阶段都需要作出决策&#xff0c;从而使整个过程达到最好的活动效果 当然&#xff0c;每个阶段的决策的选取不是任意确…

dc-6靶机

1.使用nmap进行信息搜集&#xff0c;存活主机&#xff0c;端口 192.168.85.184是存活主机&#xff0c;发现开放22&#xff0c;80端口 2.访问192.168.85.184的80端口 发现被重定向了&#xff0c;修改hosts文件 vim /etc/hosts 添加一行 192.168.85.174 wordy3.对网站进行信息搜…

彻底解决 Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0 解决方法

当我遇到这错误的时候,我去网上也找过对应解决方法,出现这个的原因有很多种情况 大多是解决Linux系统里的 我是windows系统里的MySQL服务出问题了,所有那些方法对我来说毫无意义. 好了,说一下我的解决办法,其实也很简单 只需要卸载mysql服务,注册表也要删干净,也要把环境变…

C的文件操作

&#x1f416;前言 &#x1f415;1.为什们我们要用文件 在我们之前写程序时&#xff0c;如果使用scanf函数用键盘输入数据&#xff0c;这些东西都放到内存当中&#xff0c;一旦退出程序&#xff0c;那么这些数据就会消失&#xff0c;比如就像我们写的通讯录&#xff0c;不管是…

Shiro相关知识

1、Shiro功能概述 Apache Shiro是一个功能强大且易于使用的 Java 安全框架&#xff0c;可执行身份验证、授权、加密和会话管理。 主要功能&#xff1a; Authentication&#xff1a;身份认证。登录时验证身份信息。 Authorization&#xff1a;授权操作。访问控制的过程&…

CSS布局基础(标签类型,盒子模型)

布局基础 元素显示类型&#xff0c;盒子模型 标签类型块元素常见块元素 行内元素常见行内元素 行内块元素常见行内块 模式转换显示类型显著区别 盒子模型盒子组成布局描述边框圆角 内边距外边距块元素居中盒子内行内&#xff08;块&#xff09;元素居中 外边距使用陷阱两盒子外…

【进阶C语言】动态版通讯录的实现(详细讲解+全部码源)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于C语言进阶系列&#xff0c;本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数…

Linux基础IO【重定向及缓冲区理解】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、文件描述符1.1、先描述&#xff0c;再组织1.2、files_struct1.3、分配规则…

Java数组的学习(基础)

目录 第一章&#xff1a;数组的概念介绍 1.数组的概念 2.数组的初始化/数组的创建/数组的定义 第二章&#xff1a;数组的使用 数组添加元素的方法/数组的赋值 数组的遍历 数组之选择排序的升序 数组之冒泡排序的升序 数组的最小值 数组的反转 数组中常见的异常 第三…

Python程序员想要转行,可以从这几个方面着手

最近有很多朋友问我一个问题&#xff0c;不论是我们做程序员还是做产品经理或者其他行业&#xff0c;到了30岁或35岁之后&#xff0c;都会面临各种各样的问题&#xff0c;比如达到职业天花板。有没有一种方法能够解决这种问题呢&#xff1f;我想分享一下我的观点和身边的案例。…

《Netty》从零开始学netty源码(四十七)之PooledByteBuf的方法

setBytes() 从channel中读取数据并写到PooledByteBuf中&#xff0c;分配缓存的过程与getBytes一样&#xff0c;只是duplicate为false。 capacity() 动态更新容量&#xff0c;根据新传入的容量值更改length。 如果新容量值与旧值相同则无需扩容如果为非池化内存则根据新容量值…

Zabbix部署详解

文章目录 Zabbix安装部署一、zabbix-server端部署二、zabbix-agent端部署 Zabbix安装部署 环境准备 VMware Workstation Pro 15.0 版本 系统 Centos7 内存 4G 处理器 2G 硬盘 50G 网络适配器 NAT 两台服务器&#xff0c;一台做zabbix-server、一台做zabbix-agent 关闭防火墙、…

【华为OD机试真题】信号发射和接收(javaC++python)100%通过率 超详细代码注释

信号发射和接收 知识点数组栈 单调栈时间限制: 1s 空间限制: 256MB 限定语言:不限 题目描述: 有一个二维的天线矩阵,每根天线可以向其他天线发射信号也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向发…

unity-VRTK-simulator开发学习日记2(抛物线 导包|使用|调用方法)

导包 使用抛物线 1.层级目录下添加抛物线曲线 2.将跟踪控制器 给到抛物线的“跟随资源” &#xff08;选择哪只手射出射线&#xff09; 3.激活按键 找到模拟手柄按键 找到simulator的交互的几个按键&#xff08;ButtonOne为例&#xff09; value&#xff0c;默认值为false&a…

Doris(20):Doris的函数—数学函数

1 查看函数名 show builtin functions in test_db; 2 abs(double a) 功能: 返回参数的绝对值 返回类型:double类型 使用说明:使用该函数需要确保函数的返回值是整数。 3 acos(double a) 功能: 返回参数的反余弦值 返回类型:double类型 MySQL 中反余弦函数 ACOS(…

【五一创作】使用Scala二次开发Spark3.3.0实现对MySQL的upsert操作

使用Scala二次开发Spark实现对MySQL的upsert操作 背景 在我们的数仓升级项目中&#xff0c;遇到了这样的场景&#xff1a;古人开发的任务是使用DataStage运算后&#xff0c;按照主键【或者多个字段拼接的唯一键】来做insert then update&#xff0c;顾名思义&#xff0c;也就…

能上网的ChatGPT,会带来什么改变

最近关注AI的人&#xff0c;应该会注意到这条新闻。 ChatGPT官方推出新模式—Default&#xff08;GPT-3.5&#xff09;with browsing 这个是之前ChatGPT没有的功能&#xff0c;ChatGPT以前的训练数据是在2021年左右&#xff0c;并不知道最近的新闻。 现在ChatGPT 能够联网以…

AIGC提词生成图片(人物照片)练习笔记

文生图, 图生图 等 AIGC 创作大火, 也来体验一下吧. 本文记录了环境搭建过程与使用心得. 如果动手能力弱或只想省心, 有 环境要求 列出来我的环境吧: CPU, AMD Ryzen 7 5800X 8-Core ProcessorRAM, 32GGPU, NVIDIA GeForce RTX 2070 SUPER (8G)OS, Windows 11 专业版开发环境…

Qt MSVC开发

环境搭建 安装Virsual Studio&#xff0c;版本可以选择最新版本&#xff0c;我安装的时vs2022&#xff0c;安装时需要勾选 C 桌面开发 安装QT, 下载地址&#xff1a;https://download.qt.io/official_releases/online_installers/&#xff0c;安装时需要选择MSVC 2019 64-bit。…

Packet Tracer - 配置 RIPv2

Packet Tracer - 配置 RIPv2 目标 第 1 部分&#xff1a;配置 RIPv2 第 2 部分&#xff1a;验证配置 拓扑图 背景信息 尽管在现代网络中极少使用 RIP&#xff0c;但是作为了解基本网络路由的基础则十分有用。 在本活动中&#xff0c;您将使用适当的网络语句和被动接口配置…