C++语法·叭

news2024/11/29 23:22:17

          阁下何不乘风起,扶摇直上九万里。       qi fei

4ee7a40c5eb64825b16caa45d2360372.jpeg        

 

目录

内存管理

分区介绍

1.栈区:

2.内存映射段:

3.堆:

4.数据段:

5.代码段:

补充:

C内存管理(简略回忆)

C++内存管理

new(开辟空间) delete(释放空间)

内置类型

自定义类型

异常

operator new 与 operator delete函数

operator new

operator delete

补充QeQ

匹配问题

定位new

总结

malloc/free和new/delete的共同点为:

不同点:

小知识


 

内存管理

分区介绍

acb1cccd10364127ae8b367f926c04d2.png

1.栈区:

又叫堆栈,存放非静态局部变量/函数参数/返回值等等,栈相对来说是向下增长的。

2.内存映射段:

是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享来共享内存,做进程间通信(这个比较复杂,现在先不展开,了解即可)

3.堆:

用于程序运行时动态分配内存,堆是可以向上增长的。

4.数据段:

储存全局数据和静态数据

5.代码段:

可执行的代码/只读常量

补充:

栈区的空间较小,而堆区的空间很大。

C内存管理(简略回忆)

C语言中,内存管理总共有四种函数,malloc、calloc、realloc、free。

其中malloc和calloc是开辟空间的函数,malloc开辟时不会对开辟的空间进行初始化,calloc开辟时会将开辟的空间按内存置0,记得开辟较大空间时要检查是否开辟成功。

realloc作用是扩容,只能对malloc或calloc开的空间进行扩容,分为原地扩容和异地扩容。

原地扩容:如果在原来开辟的空间后有足够的空间,就会返回原地址,叫原地扩容。

异地扩容:如果在原来开辟的空间后没有足够的空间,就会一块新空间,将原空间数据拷贝过来,然后释放原空间,返回新地址,叫异地扩容。

free是释放,只能释放动态开辟的空间,记得每次动态开辟后要进行释放,否则可能会造成内存泄漏。(虽然一般程序结束时操作系统也会回收内存,在程序运行时会有内存泄漏等诸多问题)

------------------------------------

C++内存管理

new(开辟空间) delete(释放空间)

在C语言中,动态开辟空间需要计算字节大小,而C++中不需要。

内置类型

d484f2b7c04a415994068a3c68be3e5e.png

p1为一个int大小的空间 ,new + 类型

p2一个大小为5的数组, [n]为要开辟n个

p3为一个int大小的空间,并初始化为5, (n)为要初始化的值

p4为一个大小为8的数组,并进行初始化, { } 用来连续初始化,如果未给足够的初始化值,则无对应值的位置置为0

注:1.new出来的空间默认是不会初始化的。

2.申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[] ,注意要匹配着使用。

自定义类型

new和delete对于自定义类型会先开空间然后调用默认构造函数来初始化,没有默认构造会报错。

6be881aafc7e49508f4afbc5679c6016.png

b1b04ea46d54403f8887ba0b16fe2990.png

对于连续多个类型初始化要用{(),(),()}来初始化,只用()要么为一个参数要么为逗号表达式还是一个参数。

364aeee4618a46a5bfc7f7744d84d975.jpeg

异常

new开辟失败后不会像malloc和calloc一样返回空指针,而是抛出一个异常,而异常必须被捕获,否则会报错,使用try + catch来捕获,这个捕获也比较复杂,所以暂且搁置,以后会总结到。

operator new 与 operator delete函数

这两个函数是系统提供的全局函数,不是重载,new在底层通过调用operator new来申请空间,delete在底层通过调用operator delete来释放空间。

operator new

其实这个函数使用的是malloc来开辟空间

operator delete

其实这个函数使用的是free释放空间

所以它们就是malloc和free的封装,在malloc的基础上将开辟失败返回空指针改为了抛异常。

补充QeQ

new单个自定义类型空间时:new = operator new + 默认构造函数 

连续个时:new = operator new循环 + 多个默认构造函数

delete单个自定义类型空间时:delete = 析构函数 + operator delete 

连续个时:delete = 多个析构函数 + operator delete循环

匹配问题

匹配指malloc和free匹配,new和delete匹配,连续空间和连续空间匹配,单个空间和单个空间匹配。

强调:

如果乱搭配不一定会报错,对于内置类型乱搭配很少会有错误,但对于自定义类型来说,就会导致不少错误。  (不过建议最好搭配使用,既清晰也方便他人观看)

自定义类型推荐使用new和delete,方便快捷,但要在开辟连续空间时用匹配的delete来释放,因为只用delete是只会调用析构一次,然后就释放了,但构造函数会在operator new开辟的空间进行对象的初始化,这些空间需要自定义类型自己的析构函数才能正确释放,所以new的空间就不能被正确的释放,导致内存泄漏。

在VS及某些编译器上,new在自定义类型时,会多开几个字节的空间放在最前方,但返回的还是要开的大小的空间的首地址,那么,这几个字节空间用来存什么呢,存的是要开的对象个数,也就是[ ]中的数值,用来告诉与它匹配的delete[ ]析构的次数,因为new了多少个对象就构造了多少,自然就要析构多少。   

总结下:new和delete匹配,operator new一下,构造一下, 然后析构一下,operator delet一下。

new[ ]和delete[ ]匹配,operator new 循环,构造N下,然后析构N下,operator delete 循环,

完美释放,无内存泄漏。

定位new

定位new表达式是在已经分配的原始内存空间中调用构造函数进行初始化一个对象。

a7cce4f341974a549abb03e8aa51ccbd.png

就像是定位到p1这个空间去进行构造。

但其实平常我们要实例化一个对象只需直接用new 类型  就好了,定位new不用在这里。

谈到定位new的使用场景,就要提到池化技术(内存池、线程池、连接池等),像内存池就是向操作系统要一块未初始化的空间,用来供给使用,定位new正好用在这里。

内存池简介:对于要频繁申请空间的时候,一次申请一大块空间,作为一个储蓄池,让每次使用时都能从这个池子里申请,而不是频繁的向操作系统申请,降低效率。

------------------------------------

总结

malloc/free和new/delete的共同点为:

都是从堆上申请空间,并且需要用户手动释放。

不同点:

1.malloc和free是函数,而new和delete是操作符。


2.malloc申请的空间不会初始化,new是可以去初始化。


3.malloc申请空间时,需要手动计算大小并传过去,new不需要,new只需在后面跟上空间的类型,如果是多个对象,[ ]中指定对象个数即可。


4.malloc的返回值为void* ,在使用时要强制转化,new不需要,因为new已经给类型并且按照类型开空间了。


5.malloc申请空间失败时,返回的是NULL,因此使用时要assert断言判空或if语句+perror判空,但new不会返回NULL,只会抛异常,只需要捕获异常。


6.申请自定义类型空间时,malloc只能开辟空间,而new既可以开辟空间,又可以调用自定义类型的析构函数进行对象的初始化;free只能释放空间,而delete既可以调用自定义类型的析构函数将对象析构,完成空间中资源的正确清理,又可以将空间释放。

小知识

1.四年一闰,百年不闰,四百年又一闰,为什么天数有差距呢,因为一年实际测算又365天5小时48分46秒,为了补齐天数,每四年加一天,也就是在二月加了一天,但因为它不是正好比365天多6小时,所以四年加一天还是不够,就百年再加一天,而百年加一天加多了,就四百年不加。

2.编译器可能会对无意义的代码进行优化,不去执行它。比如:a+b; 不用变量接收,也不进行操作,就是无意义。编译器直接忽略不管。

 

 

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

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

相关文章

数据库期末复习题库

1. Mysql日志功能有哪些? 记录日常操作和错误信息,以便了解Mysql数据库的运行情况,日常操作,错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份:全部都备份一遍表备份:只提取数据库中的数据&#xff0…

矩阵重新排列——rot90函数

通过 r o t 90 rot90 rot90函数可以将矩阵进行旋转 用法: r o t 90 ( a , k ) rot90(a,k) rot90(a,k)将矩阵 a a a按逆时针方向旋转 k 9 0 ∘ k\times90^\circ k90∘

挑战用React封装100个组件【001】

项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于需要展示图文信息的场景,比如产品介绍、用户卡片或任何带有标题、描述和可选图片的内容展示 样式展示 代码展示 InfoCard.tsx import ./InfoCard.cssinterface InfoCardProps {ti…

联通云服务器部署老项目tomcat记录

1.先在服务器上安装mysql和tomcat 2.tomcat修改端口 3.在联通云运控平台配置tomcat访问端口(相当于向外部提供可访问端口) 4.将tomcat项目放在服务器tomcat的webapps里面 5.在mysql里创建项目数据库,运行sql创建表和导入数据 6.在配置文…

Python 删除Word中的表格

在处理Word文档时,我们经常会遇到需要删除表格的情况。无论是为了简化文档结构,还是为了更新内容,删除表格都是一个常见的操作。但是通过手动删除不仅耗时,而且容易出错,本文将介绍如何使用Python通过编程删除Word中的…

讯飞语音转写WebApi 【JS语言】

讯飞语音转写 API 文档 文档地址:https://www.xfyun.cn/doc/asr/ifasr_new/API.html 看到没有 js 版本的 demo(音频流模式),所以就搞了一个分享出来 在 React Native 运行环境下测试有效。 1、生成 signa import axios from a…

c++基础开发环境vscode+mingw-w64

c开发需要的基础有两个:编译环境,开发环境。 最简单的编译环境可以用gcc,cl,clongllvm; 开发环境最简单直接用文本编辑器就可以。 但是实际开发都会用ide来做,现代的ide即有开发环境可以写代码,自动补全&am…

DBA面试题-1

面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…

LSTM卫星轨道预测(一)

一.多文件预测 代码详细解析 1. 文件读取与数据处理 功能 从 .sp3 文件中读取卫星轨迹数据。提取包括 Satellite_ID, X, Y, Z 等字段的信息。计算派生特征(如速度和加速度),便于后续建模使用。 主要函数:extract_sp3_data(fil…

如何通过智能生成PPT,让演示文稿更高效、更精彩?

在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…

格网法计算平面点云面积(matlab版本)

1、原理介绍 格网法计算平面点云面积,其思想类似高中油膜法计算面积。其将点云投影到水平面,再将点云划分成尺寸相同的格网。最后,统计格网内包含点的数量number,那么可利用如下公式计算得到点云的面积: Aeranumber*L…

无代码实现可视化GIS+模型+三维

现在的工具是越来越方便了,本来不是做前端的。可以节省很多的人力和时间,更快的搭建自己想要的可视化大屏,看例子 主要由三维的gis地图和模型加上二维的数据表格分析来实现这个可视化界面。 gis地图的设置 每一个gis都要设置世界远点&#x…

Jmeter中的监听器

3)监听器 1--查看结果树 用途 调试测试计划:查看每个请求的详细信息,帮助调试和修正测试计划。分析响应数据:查看服务器返回的响应数据,验证请求是否成功。检查错误:识别和分析请求失败的原因。 配置步骤…

kafka进阶_3.消费消息

文章目录 一、消费消息概览1.1、消费示例代码1.2、消费过程 二、消费者组2.1、push & pull2.2、消费者组 三、调度器Coordinator四、消费者分配策略4.1、引言4.2、分配基本流程4.3、分配策略4.3.1、轮询分配策略4.3.2、轮询分配策略 五、消费偏移量5.1、起始偏移量5.2、指定…

用VC2019+MFC 创建一个DLL封装MD工业相机库然后用EXE调用这个相机库采图并且显示

主要描述: 用VC2019MFC 创建一个DLL封装MD工业相机库,再建一个EXE调用这个相机库采图并且显示。 先创建库工程: 新建一个库工程, 创建完成,添加一个DllFunction.h头文件,一个DllFunction.cpp 源文件 拷贝…

ODB 框架

目录 概述 基本工作原理 映射C对象到数据库表 从数据库中加载对象 持久化C对象到数据库 ODB常用接口 表创建预处理 #pragma db Object table 数据表属性 id auto column(“xxx”) type("xxx") unique index null default&…

ModuleNotFoundError: No module named ‘_ssl‘ centos中的Python报错

1、检查系统有没有openssl,有的话,就是python安装时没有指定openssl openssl version,有输出版本号就有,没有的话,需要手动安装 下载地址 参见https://www.openssl.org/,包括以下版本: https:/…

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

linux高级系统编程之进程

进程 一个正在进行的程序 并行与并发 并行:执行的程序在不同CPU上同时执行 并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的 单道与多道 单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空…

GitHub Copilot革命性更新:整合顶尖AI模型,如何重塑开发体验?

在技术快速发展的今天,代码辅助工具已成为提升开发效率的利器。今天,我们带来了一个激动人心的消息——GitHub Copilot宣布引入多模型选择功能,这不仅是技术上的一次飞跃,更是对开发者工作流程的一次革新。 多模型选择&#xff1a…