C++语法·叭
阁下何不乘风起,扶摇直上九万里。 qi fei
目录
内存管理
分区介绍
1.栈区:
2.内存映射段:
3.堆:
4.数据段:
5.代码段:
补充:
C内存管理(简略回忆)
C++内存管理
new(开辟空间) delete(释放空间)
内置类型
自定义类型
异常
operator new 与 operator delete函数
operator new
operator delete
补充QeQ
匹配问题
定位new
总结
malloc/free和new/delete的共同点为:
不同点:
小知识
内存管理
分区介绍
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++中不需要。
内置类型
p1为一个int大小的空间 ,new + 类型
p2一个大小为5的数组, [n]为要开辟n个
p3为一个int大小的空间,并初始化为5, (n)为要初始化的值
p4为一个大小为8的数组,并进行初始化, { } 用来连续初始化,如果未给足够的初始化值,则无对应值的位置置为0
注:1.new出来的空间默认是不会初始化的。
2.申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[] ,注意要匹配着使用。
自定义类型
new和delete对于自定义类型会先开空间然后调用默认构造函数来初始化,没有默认构造会报错。
对于连续多个类型初始化要用{(),(),()}来初始化,只用()要么为一个参数要么为逗号表达式还是一个参数。
异常
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表达式是在已经分配的原始内存空间中调用构造函数进行初始化一个对象。
就像是定位到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; 不用变量接收,也不进行操作,就是无意义。编译器直接忽略不管。
相关文章:
C++语法·叭
阁下何不乘风起,扶摇直上九万里。 qi fei 目录 内存管理 分区介绍 1.栈区: 2.内存映射段: 3.堆: 4.数据段: 5.代码段: 补充: C内存管理(简略回忆) C内存…...
ComfyUI | ComfyUI桌面版发布,支持winmac多平台体验,汉化共享等技巧!(内附安装包)
ComfyUI 桌面版正式推出,支持 Windows 与 macOS 等多平台,为 AI 绘画爱好者带来全新体验。其安装包便捷易用,开启了轻松上手之旅。汉化共享功能更是一大亮点,打破语言障碍,促进知识交流与传播。在操作上,它…...
探索Python词云库WordCloud的奥秘
文章目录 探索Python词云库WordCloud的奥秘1. 背景介绍:为何选择WordCloud?2. WordCloud库简介3. 安装WordCloud库4. 简单函数使用方法5. 应用场景示例6. 常见Bug及解决方案7. 总结 探索Python词云库WordCloud的奥秘 1. 背景介绍:为何选择Wo…...
用PHP抓取HTTPS资源时的常见问题与解决方法
概述 随着互联网的发展,HTTPS已经成为主流协议,网站的数据安全性得到了显著提升。然而,对于开发者来说,HTTPS的广泛应用也增加了数据抓取的复杂性。尤其是在PHP中实现HTTPS资源的抓取时,开发者可能会遇到以下问题&…...
spring知识点复习--针对面试的
前言 此内容是笔者通过B站的视频总结而来。原视频链接地址:6、Bean Factory与FactoryBean有什么区别_哔哩哔哩_bilibili 1.谈谈springIOC的理解,原理与实现 回答涉及到的点: 控制反转:是一种理论思想,原来的对象是由…...
Web前端学习_CSS盒子模型
content padding border margin <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS盒子模型</title><style></style> </head> <body> <div class"demo&quo…...
ajax基础
一:express框架 在终端输入nodejs文件名 // 引入express const express require(express); //创建应用对象 const app express(); //创建路由规则 app.get(/,(request,response) > {//设置响应response.send(Hello Express); }); // 监听3000端口 app.lis…...
Python轴承故障诊断 (21)基于VMD-CNN-BiTCN的创新诊断模型
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…...
强化学习导论 -章9 基于函数逼近的同轨策略预测
基于函数逼近的同轨策略预测 我们前面已经完成了基于表格的学习任务,基于表格的就是每个s是独立学习的,基本上不考虑泛化的能力,但是也对于每个任务状态学习的非常好。考虑到状态空间越来越大,我们必须考虑到函数逼近的情况。 1…...
Ubuntu环境中RocketMQ安装教程
参考教程 https://blog.csdn.net/weixin_56219549/article/details/126143231 1、安装JDK,并配置环境变量(略) 2、下载RocketMQ安装包 RocketMQ下载地址,选择二进制包下载 unzip rocketmq-all-5.0.0-ALPHA-bin-release.zip 使…...
Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)
上篇文章:Linux操作系统2-进程控制2(进程等待,waitpid系统调用,阻塞与非阻塞等待)-CSDN博客 本篇代码Gitee仓库:Linux操作系统-进程的程序替换学习 d0f7bb4 橘子真甜/linux学习 - Gitee.com 本篇重点:进程替换 目录 …...
ThinkPHP Nginx 重写配置
目录 NGINX 重写 Admin项目隐藏入口文件,且禁用Admin模块&Admin.php 1️⃣配置仅用模块 2️⃣新增admin_xyz.php文件(自定义入口文件名),并绑定admin模块 3️⃣配置nginx 重写规则 NGINX 重写 在Nginx低版本中࿰…...
SpringBoot小知识(2):日志
日志是开发项目中非常重要的一个环节,它是程序员在检查程序运行的手段之一。 1.日志的基础操作 1.1 日志的作用 编程期调试代码运营期记录信息: * 记录日常运营重要信息(峰值流量、平均响应时长……) * 记录应用报错信息(错误堆栈) * 记录运维过程数据(…...
深度学习:利用GPU进行训练
深度学习:利用GPU进行训练 在现代深度学习框架中,如PyTorch,利用GPU加速模型训练是一种常见的做法。GPU(图形处理单元)由于其并行处理能力,特别适合执行大量的矩阵运算,这在训练神经网络时尤为…...
PHP 生成分享海报
因为用户端有多个平台,如果做分享海报生成,需要三端都来做,工作量比较大。 所以这个艰巨的任务就光荣的交给后端了。经过一定时间的研究和调试,最终圆满完成了任务,生成分享海报图片实现笔记如下。 目录 准备字体文件…...
A050-基于spring boot物流管理系统设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
【docker】8. 镜像仓库实战
综合实战一:搭建一个 nginx 服务 Web 服务器 Web 服务器,一般是指“网站服务器”,是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览…...
基于Springboot在线招投标系统【附源码】
基于Springboot在线招投标系统 效果如下: 系统主页面 系统登陆页面 招标人信息管理页面 招标信息管理页面 招标信息页面 评标信息页面 中标信息页面 研究背景 随着互联网技术的不断发展,传统的招投标方式已经无法满足现代企业的需求。传统的招投标流程…...
elasticsearch集群部署及加密通讯
原文地址:elasticsearch集群部署及加密通讯 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 第零步,准备 给各台设备配置虚拟主机名,这样集群不依赖IP,即使IP变动,改动也更方便。参考…...
yolov5的pt模型转化为rk3588的rknn,并在rk3588上调用api进行前向推理
当使用yolov5进行目标检测且进行边缘计算的场景时,要考虑性价比或者国产化的话,rk3588板子是个不错的选择。 本篇介绍yolov5的pytorch模型转化为rknn的流程,并展示在rk板子上如何调用相关api来使用转好的rknn模型进行前向推理。 pt转rknn流程…...
【机器学习】—PCA(主成分分析)
主成分分析(PCA)详解 引言 主成分分析(PCA)是一种统计方法,它可以通过正交变换将一组可能相关的变量转换为一组线性不相关的变量,这些变量称为主成分。PCA经常用于降维,数据压缩,以…...
【Linux】vim
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、Linux开发工具 🌟vim的基本概念 二、Linux编译器-gcc/g使用 🌟gcc如何完成(ESc - iso) 1、预处理(进行宏替换ÿ…...
virtualbox给Ubuntu22创建共享文件夹
1.在windows上的操作,创建共享文件夹Share 2.Ubuntu22上的操作,创建共享文件夹LinuxShare 3.在virtualbox虚拟机设置里,设置共享文件夹 共享文件夹路径:选择Windows系统中你需要共享的文件夹 共享文件夹名称:挂载至wi…...
SQLModel与FastAPI结合:构建用户增删改查接口
SQLModel简介 SQLModel是一个现代化的Python库,旨在简化与数据库的交互。它结合了Pydantic和SQLAlchemy的优势,使得定义数据模型、进行数据验证和与数据库交互变得更加直观和高效。SQLModel由FastAPI的创始人Sebastin Ramrez开发,专为与FastA…...
数据库日志
MySQL中有哪些日志 1,redo log重做日志 redo log是物理机日志,因为它记录的是对数据页的物理修改,而不是SQL语句。 作用是确保事务的持久性,redo log日志记录事务执行后的状态,用来恢复未写入 data file的已提交事务…...
力扣第 71 题 简化路径
一、题目描述 给定一个字符串 path,表示一个由目录名和斜杠 "/" 组成的绝对路径,请简化该路径,使其变为规范路径。 在 Unix 风格的文件系统中: 一个点 "." 表示当前目录本身;两个点 "..&q…...
Android 性能优化:内存优化(理论篇)
内存作为App程序运行最重要的资源之一,需要运行过程中做到合理的资源分配与回收,不合理的内存占用轻则使得用户应用程序运行卡顿、ANR、黑屏,重则导致用户应用程序发生 OOM(out of memory)崩溃。喜马直播随着近些年的业…...
Flink四大基石之窗口(Window)使用详解
目录 一、引言 二、为什么需要 Window 三、Window 的控制属性 窗口的长度(大小) 窗口的间隔 四、Flink 窗口应用代码结构 是否分组 Keyed Window --键控窗 Non-Keyed Window 核心操作流程 五、Window 的生命周期 分配阶段 触发计算 六、Wi…...
Easy Excel 通过【自定义批注拦截器】实现导出的【批注】功能
目录 Easy Excel 通过 【自定义批注拦截器】实现导出的【批注】功能需求原型:相关数据:要导出的对象字段postman 格式导出对象VO 自定义批注拦截器业务代码: 拦截器代码解释:详细解释:格式优化: Easy Excel…...
PHP 去掉特殊不可见字符 “\u200e“
描述 最近在排查网站业务时,发现有数据匹配失败的情况 肉眼上完全看不出问题所在 当把字符串 【M24308/23-14F】复制出来发现 末尾有个不可见的字符 使用删除键或左右移动时才会发现 最后测试通过 var_dump 打印 发现这个"空字符"占了三个长度 …...
Flume和kafka的整合:使用Flume将日志数据抽取到Kafka中
文章目录 1、Kafka作为Source【数据进入到kafka中,抽取出来】2、kafka作为Sink 【数据从别的地方抽取到kafka里面】 1、Kafka作为Source【数据进入到kafka中,抽取出来】 kafka源 --> memory --> 控制台: a1.sources r1 a1.sinks k1…...
Flutter:启动屏逻辑处理02:启动页
启动屏启动之后,制作一个启动页面 新建splash:view 视图中只有一张图片sliding.png就是我们的启动图 import package:flutter/material.dart; import package:get/get.dart; import index.dart; class SplashPage extends GetView<SplashController…...
【MySQL】自动刷新flush privileges命令
在 MySQL 中,执行 FLUSH PRIVILEGES 命令的主要作用是使权限表中的更改立即生效。下面是关于这个命令的一些关键点: 1. 什么是 FLUSH PRIVILEGES 当你使用 SET PASSWORD 或其他 SQL 语句直接修改了用户的密码或权限(例如,使用 U…...
2024免费天气接口(无废话版)
免费接口1:http://t.weather.sojson.com/api/weather/city/101030100 免费接口2:http://t.weather.itboy.net/api/weather/city/101030100 至于后面那个城市编码 请自行查询:如图 注意!!! 点击下载时 可能…...
fpga 时序分析基础
目录 触发器的动态参数 同步时序电路分析 1. 时钟脉冲的特性 2. 同步时序电路分析 Timing Analyzer的应用 异步时序与亚稳态问题 时序分析就是对时序电路进行时序检查,通过分析电路中所有寄存器之间的路径延迟以检查电路的传输延迟是否会导致触发器的建立时间…...
Laravel8.5+微信小程序实现京东商城秒杀方案
一、商品秒杀涉及的知识点 鉴权策略封装掊口访问频次限制小程序设计页面防抖接口调用订单创建事务使用超卖防御 二、订单库存系统方案(3种) 下单减库存 优点是库存和订单的强一致性,商品不会卖超,但是可能导致恶意下单ÿ…...
Git——本地仓库链接并推送到多个远程仓库
步骤 1. 新建仓库init 或 删除已有仓库远程链接 // 1.新建init git init// 2.已有仓库,查看链接的远程仓库 git remote -v// 3.已有远程连接仓库,需要删除连接 git remote rm origin(或对应远程仓库名) 2.新建远程仓库 在gitee、github等托管平台创建…...
llama-factory 系列教程 (七),Qwen2.5-7B-Instruct 模型微调与vllm部署详细流程实战
文章目录 介绍llama-factory 安装装包下载模型 微调模型数据集训练模型 微调后的模型推理 介绍 时隔已久的 llama-factory 系列教程更新了。本篇文章是第七篇,之前的六篇,大家酌情选看即可。 因为llama-factory进行了更新,我前面几篇文章的实…...
Spring Boot的理解
一、什么是Spring Boot? Spring Boot是一个用于构建基于Spring框架的应用程序的开源框架。它简化了Spring应用程序的开发过程,使开发者能够更容易地创建独立运行的、生产级别的Spring应用程序。Spring Boot提供了许多功能和约定,可以帮助开发者快速搭建…...
QT QFormLayout控件 全面详解
本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…...
系统性能定时监控PythonLinux
系统性能定时监控 1.系统监控概述 ⽤Python来编写脚本简化⽇常的运维⼯作是Python的⼀个重要⽤途。在Linux下,有许多系统命令可以让我们时刻监控系统运⾏的状态,如 ps , top , free 等等。要获取这些系统信息,Python…...
python学习——列表的相关操作
在 Python 中,列表(list)是一种非常灵活的数据结构,可以用来存储一系列的元素。以下是列表的一些常见操作: 文章目录 创建列表访问元素修改元素列表切片添加元素删除元素列表推导式其他操作pop基本用法指定索引使用场…...
HTML CSS 魔法秀:打造翻转卡片登录注册页面
这段 HTML 和 CSS 代码创建了一个具有翻转卡片效果的登录和注册页面。下面是对重点标签和 CSS 样式的解释和总结: 一键复制 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"…...
Web day04 SpringBoot
目录 1.Spring概念: 2. spring程序快速入门: 3.HTTP协议: 特点: 基于TCP 协议: 基于请求响应模型: HTTP协议是无状态协议: 请求协议:为浏览器向服务器发出的消息 获取请求数据…...
selinux和防火墙实验
1 、 selinux 的说明 SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 系统资源都是通过程序进行访问的,如…...
ClamAV 在 CentOS 的开发版本 `clamav-devel`
是的,ClamAV 在 CentOS 上有开发版本(通常称为 clamav-devel),它包含了开发 ClamAV 应用程序所需的头文件和库文件。以下是如何在 CentOS 上安装 ClamAV 及其开发版本的步骤。 ### 1. **安装 EPEL 仓库** ClamAV 通常在 EPEL&am…...
C++《二叉搜索树》
在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现,那么接下来我们将进一步的学习二叉树,在此会先后学习到二叉搜索树、AVL树、红黑树;通过这些的学习将让我们更易于理解后面set、map、哈希等…...
⭐️ GitHub Star 数量前十的工作流项目
文章开始前,我们先做个小调查:在日常工作中,你会使用自动化工作流工具吗?🙋 事实上,工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客,跟大家分享五个好用的工作流工具。…...
uni-app中的样式尺寸单位,px,rpx,vh,vw
uni-app 支持less、sass、scss、stylus等预处理器。 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素rpx 即响应式 px,一种根据屏幕宽度自适应的动态单位。以 750 宽的屏幕为基准,**750rpx 恰好为屏幕宽度。**屏幕变宽,r…...
跳表(Skip List)
跳表(Skip List) 跳表是一种用于快速查找、插入和删除的概率型数据结构,通常用于替代平衡二叉搜索树(如 AVL 树或红黑树)。跳表通过在有序链表的基础上增加多层索引,使得查找操作的平均时间复杂度降低&…...