03.C++内存管理笔记

news2024/11/20 20:37:54

1、C/C++内存分布

①内存分那么多区的原因:不同的数据,有不同的存储需求,各区域满足了不同的需求。

②存放:

临时变量等临时用的变量:栈区;

动态申请的变量:堆区;

全局变量和静态变量等整个程序期间都使用的变量:数据段;

常量、可执行代码等只读数据:代码段;

2、C语言中动态内存管理方式:malloc/calloc/realloc/free

3、C++内存管理方式

C语言的内存管理方式在C++中依然可以使用但是有些情况不方便,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

①new/delete操作内置类型

1°new操作符

动态开辟一个整型:

int* p=new int;

动态开辟一个整型同时赋个初值:

int* p=new int(3);

动态开辟多个整型:

int* p=new int[10];

动态开辟多个整型同时赋值:

int* p=new int[10]{1,2,3};

2°delete操作符

释放申请的一个空间:

delete p;

释放申请的多个空间:

delete[] p;

★new和delete,new[]和delete[]匹配起来使用;

★对于内置类型,malloc和new除了用法上的区别,没有别的区别;

②new/delete操作自定义类型

C语言的动态管理对于自定义类型是不好解决初始化的,所以必须要使用C++提供的new和delete

1°new操作符

动态开辟一个自定义类型:

A* p=new A;       //A是一个自定义的类

动态开辟一个自定义类型同时赋初值:

A* p=new A(1);       //自定义类型有传一个整型的构造函数

动态开辟多个自定义类型:

A* p=new A[3];          //开辟三个自定义类型的对象

动态开辟多个自定义类型同时赋初值:

A* p=new A[3]{1,2,3};         //隐式类型转换赋初值
A* p=new A[3]{aa1,aa2,aa3};     //利用已有的对象赋初值
A* p=new A[3]{A(1),A(2),A(3)};           //用匿名对象赋初值

★new的本质:开空间+调用构造函数初始化

2°delete 

释放申请的一个空间:

delete p;

释放申请的多个空间:

delete[] p;

★delete的本质:调用析构函数+释放空间

③new失败

1°new失败的话会抛出异常,但是异常需要捕获;

2°cout打印char*类型的数据的时候,默认打印的是字符串类型,想要打印地址可以使用printf或者前面加(void*)强制类型转换

4、operator new与operator delete函数

①new和delete是用户进行动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层调用operator delete全局函数来释放空间。(这两个函数不是对new和delete的重载)

②operator new和operator delete封装的malloc和free。malloc失败了返回0,operator new失败了抛异常,这样更符合面向对象的特性。operator delete是为了和operator new配对。

5、new和delete的实现原理

①new和delete是操作符,运行时new直接转换成汇编指令,汇编指令中调用了operator new之后调用构造函数,delete直接转换成汇编指令,汇编指令中调用了析构函数之后,调用operator delete。

即:

new的原理:调用operator new函数申请空间

                     在申请的空间上执行构造函数,完成对象的构造

delete的原理:在空间上调用析构函数,完成对对象资源的清理工作

                        调用operator delete函数完成对象空间的释放

new[]的原理:调用1次operator new[]函数申请N个对象的空间   

                       在申请的空间上执行N次构造函数,完成对象的构造

                       ★开空间时会在空间的头部多开四个字节的空间。

                       ★多开四个字节空间是为了告诉delete[]调用析构函数时调用几次

delete[]的原理:在空间上调用N次析构函数,完成对对象资源的清理工作

                          调用1次operator delete函数完成对象空间的释放

                          ★释放空间时会向前减四个字节开始释放空间

▲如果使用new[]申请空间,使用delete释放空间,逻辑上一定是错的,但是可是报错,可能不报错。报错是因为,new[]申请空间时在空间的前面多申请了四个字节的空间,delete释放是没有从四个字节前开始释放,相当于从中间开始释放的,这是肯定会报错的。不报错的话,就是因为你的类没有显式的写析构函数,并且你的成员变量都是内置类型,new[]申请空间时前面没有多申请前面四个字节的空间,所以使用delete释放也是可以的,但是这属于编译器的优化,是编译器做的,不一样的编译器不一定做法相同。所以写的时候一定要注意匹配的问题。

6、定位new表达式(placemen-new)

①构造函数和析构函数都可以显式调用,析构函数像调用普通函数一样直接调用就好了,而构造函数像普通函数一样直接调用会报错,需要使用定位new来进行显式调用。

②定位new显式调用构造函数的主要场景:

一般定位new都是和内存池一起配合使用的,我们频繁去堆开辟一小块空间是效率非常低的,所以有了内存池的概念,内存池就是一次在堆中申请一块比较大的空间,然后我们创建对象时先去内存池看看空间够不够,空间不够就去堆中开辟,空间够就直接使用内存池内的空间,而内存池的空间是以前开辟的,所以是未初始化的,我们想要初始化就需要使用定位new来显式调用构造函数。

③使用格式:

new(place_address) type 或者new(place_address) type (Initializer_list)

place_address:必须是一个指针

initializer_list:是类型的初始化列表

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

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

相关文章

[渗透测试学习] Surveillance -HackTheBox

文章目录 信息搜集getshell提权信息搜集 nmap扫描端口 nmap -sV -sC -v -p- --min-rate 1000 10.10.11.245扫出来两个端口,其中80端口有http服务并且重定向到surveillance.htb 那么我们添加下域名然后访问80端口,发现是企业网站尝试扫描子域名和目录无果后,用Wappalyzer插…

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲(简称“拉美”)绝大多数消费者来说还是一个新鲜技术。GSMA报告显示,过去五年,拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中,紧跟全球5G发展大潮&#…

「 典型安全漏洞系列 」02.SQL注入详解

引言:SQL注入是一个老生常谈且又非常重要的漏洞,导致许多热点的数据泄露事件。尽管学习起来相对简单,但它可能用于某些高危漏洞的利用。这使得它成为初学者的兴趣点,甚至对于更有经验的用户来说,SQL注入也是基本知识。…

R语言下载安装及VScode配置

文章目录 1. R 下载和安装1.1 下载1.2 安装 2. VSCODE 配置2.1 安装R拓展2.2 安装R语言辅助功能包2.3 DEBUG 1. R 下载和安装 1.1 下载 网址:https://www.r-project.org/ 选择一个镜像地址下载 选择对应的版本 一般选择base即可 1.2 安装 下载安装包后按提示安装…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin 手指在上面的图上移动,“剪切”出上面图中以手指触点为中心的图(半径图),然后在下面的ImageView显示。 impor…

java实现AES256对称加解密工具类

一、引入依赖包 引入相关依赖包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version> </dependency> <!--lombok用于简化实体类开发--> <dependency&g…

MySQL-索引回顾

索引是面试高频问答题&#xff0c;参考百度/CSDN/尚硅谷/黑马程序员/阿里云开发者社区&#xff0c;决定将索引知识回顾一下&#xff0c;忘记时&#xff0c;点开即可&#xff0c;时刻保持更新&#xff0c;事不宜迟&#xff0c;即刻享用。 索引概述 索引&#xff08;index&#…

2000-2021年全国各省环境相关指标数据(890+指标)

2000-2021年全国各省环境相关指标数据&#xff08;890指标&#xff09; 1、指标时间&#xff1a;2000-2021年 2、范围&#xff1a;31省市 3、来源&#xff1a;2001-2022年环境统计年鉴 4、指标&#xff1a;工业废水排放总量、工业废水排放达标量、工业废水处理量、化学需氧…

离散数学3

补变元 解释&#xff1a;它是以反^作为一组一组的&#xff0c;因此&#xff0c;对于P反^Q来说&#xff0c;P是一组&#xff0c;Q是一组&#xff0c;又有以下&#xff1a;对缺少变元的项要补齐&#xff0c;P缺少Q&#xff0c;Q缺少P。因此&#xff0c;补齐。 用分配律展开 解释&…

基于Vue组合式API的实用工具集

简介 今天,给大家分享一个很实用的工具库 VueUse,它是基于 Vue Composition Api,也就是组合式API。支持在Vue2和Vue3项目中进行使用,据说是目前世界上Star最高的同类型库之一。 图片 官方地址:https://vueuse.org/ 中文地址:https://www.vueusejs.com/ github:https…

深度解析Cron表达式:精确控制任务调度的艺术

深度解析Cron表达式&#xff1a;精确控制任务调度的艺术 希望我们都可以满怀期待的路过每一个转角 去遇见 那个属于自己故事的开始 去追寻那个最真实的自己 去放下 去拿起 安然&#xff0c;自得&#xff0c;不受世俗牵绊… 导言 在计算机科学领域&#xff0c;任务调度是一项关…

RabbitMQ(六)消息的持久化

目录 一、简介1.1 定义1.2 消息丢失的场景 二、交换机的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.exchangeDeclare()方式三&#xff1a;ExchangeBuilder【推荐】 三、队列的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.queueDeclare()方式三…

【算法Hot100系列】组合总和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

回首24考研历程,那些无法忘却的收获

文章目录 毅力与坚持&#x1f44d;知识的力量&#x1f9d0;心态的历练&#x1f913;友谊与互助( •̀ ω •́ )y未来的启示(●◡●) 在这个充满希望与挑战的时刻&#xff0c;我想与你们分享一段关于2023这一年特别的经历——考研之路。这段旅程既有磨砺的痛楚&#xff0c;也有…

基础篇_快速入门(Java简介,安装JDK,cmd命令行运行Java文件产生乱码问题的解决方式,IDE工具,实用工具)

文章目录 一. Java 简介1. JVM2. JRE3. JDK 二. 安装 JDK1. 下载和安装2. 配置 Path3. 配置 JAVA_HOME&#xff08;选讲&#xff09;优化 三. 入门案例1. 第一行代码1) jshell2) 代码解读总结 3) 为何要分成对象与方法 2. 第一份源码1) 源码结构2) 编写 java 源代码3) 编译 jav…

Python基础知识:整理10 异常相关知识

1 异常的捕获 1.1 基础写法 """基本语法&#xff1a;try:可能发生错误的代码except:如果出现异常&#xff0c;将执行的代码""" try:fr open("D:/abc.txt", "r", encoding"utf-8") except:print("出现异常…

1小时收到几百份简历

最近一直在招人&#xff0c;一些情况我也在星球群里也说了&#xff0c;目前找工作的人确实很多&#xff0c;只要发布职位&#xff0c;几百号人来投简历。 因为我本身带学员&#xff0c;之前我说我在boss上基本上都会回&#xff0c;但后来我让求职者总结自己的优势点时候发现&am…

C语言发展史

前言 当前&#xff0c;C语言是大学广泛应用的计算机教学语言之一&#xff0c;除了文科类专业&#xff0c;大部分理工科专业都会教授C语言&#xff0c;但是&#xff0c;C语言是谁搞出来的&#xff1f;是怎么编译的?相信很多同学对此并不清楚&#xff0c;今天&#xff0c;我们就…

【.NET Core】可为null类型详解

【.NET Core】可为null类型详解 文章目录 【.NET Core】可为null类型详解一、概述二、可为空的值类型2.1 声明和赋值2.2 检查可为空值类型2.3 基础类型与可为空的值类型互换2.4 可为空的值类型装箱和取消装箱2.5 如何确定可为空的值类型 三、可为 null 的引用类型 一、概述 nu…

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?

环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …