当前位置: 首页 > news >正文

【C++】——内存管理

目录

    • 回忆C语言内存管理
    • C++内存管理方式new delete
    • operator new与operator delete函数
    • new和delete的实现原理
    • 定位new表达式(placement-new)
    • malloc/free和new/delete的区别

回忆C语言内存管理

void Test()
{int* p1 = (int*)malloc(sizeof(int));free(p1);int* p2 = (int*)calloc(4, sizeof(int));//不用freeint* p3 = (int*)realloc(p2, sizeof(int) * 10);free(p3);
}

在这里插入图片描述

C++内存管理方式new delete

通过new和delete操作符进行动态内存管理

C++自动计算大小,不需要进行强制类型转换

int main()
{//动态申请一个int型的空间int* p1 = (int*)malloc(sizeof(int));//Cint* p2 = new int;//C++//动态申请10个int型空间int* p3 = (int*)malloc(sizeof(int) * 10);//Cint* p4 = new int[10];//C++free(p1);free(p3);delete p2;delete[] p4;return 0;
}

C++额外支持开空间和初始化

int main()
{int* p1 = new int(10);int* p2 = new int[10] {1, 2, 3};int* p3 = new int[10] {};return 0;
}

malloc没有办法很好的支持动态申请的自定义对象初始化
自定义类型,开空间+调用构造函数初始化
自定义类型,调用析构函数+释放空间

class A
{
public:A(int a = 1){cout << "A(int a = 1)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
int main()
{//自定义类型,开空间+调用构造函数初始化A* p1 = new A;A* p2 = new A(3);//自定义类型,调用析构函数+释放空间delete p1;delete p2;return 0;
}
int main()
{A aa1(1);A aa2(2);A* p1 = new A[10]{ aa1,aa2 };delete[] p1;A* p2 = new A[10]{ A(1),A(2) };delete[] p2;A* p3 = new A[10]{ 1,2 };delete[] p3;return 0;
}

栈:

typedef int DataType;
class Stack
{
public:Stack(size_t capacity=4){cout << "Stack(size_t capacity)" << endl;_array = new DataType[capacity];_size = 0;_capacity = capacity;}void Push(int x){_array[_size++] = x;}~Stack(){cout << "~Stack()" << endl;delete[] _array;_size = _capacity = 0;}
private:DataType* _array;size_t _size;size_t _capacity;
};
Stack* func()
{int n = 0;cin >> n;Stack* pst = new Stack(n);return pst;
}
int main()
{Stack* ptr = func();ptr->Push(1);ptr->Push(2);delete ptr;return 0;
}

在这里插入图片描述

operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

typedef int DataType;
class Stack
{
public:Stack(size_t capacity=4){cout << "Stack(size_t capacity)" << endl;_array = new DataType[capacity];_size = 0;_capacity = capacity;}void Push(int x){_array[_size++] = x;}~Stack(){cout << "~Stack()" << endl;delete[] _array;_size = _capacity = 0;}
private:DataType* _array;size_t _size;size_t _capacity;
};
Stack* func()
{int n = 0;cin >> n;Stack* pst = new Stack(n);return pst;
}
int main()
{Stack* pst1 = (Stack*)operator new(sizeof(Stack));operator delete(pst1);Stack* pst2 = new Stack;delete pst2;return 0;
}

operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施 就继续申请,否则就抛异常。
operator delete 最终是通过free来释放空间的。

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

new和delete形式要匹配使用

new和delete的实现原理

1、内置类型:

如果申请的是内置类型的空间,new和malloc,delete和free基本类似。不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL

2、自定义类型:

new的原理:
1、 调用operator new函数申请空间
2、在申请的空间上执行构造函数,完成对象的构造
delete的原理:
1、在空间上执行析构函数,完成对象中资源的清理工作
2、调用operator delete函数释放对象的空间
new T[N]的原理:
1、调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
2、在申请的空间上执行N次构造函数
delete[]的原理:
1、在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2、调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

定位new表达式(placement-new)

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
使用格式:new (place_address) type或者new (place_address) type(initializer-list)
place_address必须是一个指针,initializer-list是类型的初始化列表
**使用场景:**定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如
果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化

typedef int DataType;
class Stack
{
public:Stack(size_t capacity=4){cout << "Stack(size_t capacity)" << endl;_array = new DataType[capacity];_size = 0;_capacity = capacity;}void Push(int x){_array[_size++] = x;}~Stack(){cout << "~Stack()" << endl;delete[] _array;_size = _capacity = 0;}
private:DataType* _array;size_t _size;size_t _capacity;
};
Stack* func()
{int n = 0;cin >> n;Stack* pst = new Stack(n);return pst;
}int main()
{Stack* pst1 = (Stack*)operator new(sizeof(Stack));//pst1->Stack(4);//不支持new(pst1)Stack(4);//显示调用构造函数pst1->~Stack();operator delete(pst1);return 0;
}

malloc/free和new/delete的区别

共同点:
malloc/free和new/delete 都是从堆上申请空间,并且需要手动释放
不同点:
1、malloc和free是函数,new和delete是操作符
2、malloc申请的空间不会初始化,new可以初始化
3、malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可
4、malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
5、malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
6、申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

相关文章:

【C++】——内存管理

目录 回忆C语言内存管理C内存管理方式new deleteoperator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)malloc/free和new/delete的区别 回忆C语言内存管理 void Test() {int* p1 (int*)malloc(sizeof(int));free(p1);int* p2 (int*)calloc(4…...

Jmeter录制HTTPS脚本

Jmeter录制HTTPS脚本 文章目录 添加“HTTP代理服务器”设置浏览器代理证书导入存在问题 添加“HTTP代理服务器” 设置浏览器代理 保持端口一致 证书导入 点击一下启动让jmeter自动生成证书&#xff0c;放在bin目录下&#xff1a; 打开jmeter的SSL管理器选择刚刚生成的证书&…...

Linux 的Centos 7 安装 启动 Google Chrome

我之所以在Centos上安装Chrome主要是为了让Web自动化测试工具可以启动Chrome&#xff0c;协助我做一些工作。 参考&#xff1a;centos7 google-chrome的安装与启动 - 简书 1.安装chrome逻辑 1. 下载安装包 2. 安装 3. 启动 》这就是在window上的逻辑&#xff0c;只是用命令行…...

DNS WEB HTTP

DNS与域名 网络是基于 TCP/IP 协议进行通信和连接的。 每一台主机都有唯一的标识&#xff0c;用于区别在网络上成千上万个用户和计算机。即固定的IP地址&#xff08;32位二进制数转换成为十进制数——点分十进制&#xff09;。每一个与网络相连接的计算机和服务器都被指派一个…...

微信小程序animation动画,微信小程序animation动画无限循环播放

需求是酱紫的&#xff1a; 页面顶部的喇叭通知&#xff0c;内容不固定&#xff0c;宽度不固定&#xff0c;就是做走马灯&#xff08;轮播&#xff09;效果&#xff0c;从左到右的走马灯&#xff08;轮播&#xff09;&#xff0c;每播放一遍暂停 1500ms &#xff5e; 2000ms 刚…...

node.js

什么是Node.js Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,使开发者可以搭建服务器端的JavaScript应用程序 概念: 使用Node.js编写后端程序 // 支持前端工程化 ​ 后端程序&#xff1a;提供接口和数据 &#xff0c;网页资源 ​ 前端工程化:对代码压缩&…...

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息

【微信小程序创作之路】- 小程序远程数据请求、获取个人信息 第七章 小程序远程数据请求、获取个人信息 文章目录 【微信小程序创作之路】- 小程序远程数据请求、获取个人信息前言一、远程数据请求1.本地环境2.正式域名 二、获取用户个人信息1.展示当前用户的身份信息2.获取用…...

XML基础知识讲解

文章目录 1. xml简介2. xml快速入门3. xml的元素(标签)定义4. xml标签的命名规范5. xml的属性定义和注释6. 转义字符7. CDATA区8. xml的处理指令9. xml的约束 1. xml简介 XML&#xff08;eXtensible Markup Language&#xff09;是一种用于描述数据的标记语。 它以纯文本的方…...

(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移&#xff0c;HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件&#xff1a;ZooKeeper 和 ZKFailoverController &#xff08;ZKFC&…...

Ubuntu下载deb包及其依赖包

一、简介 有时我们需要在离线环境使用提前准备好的deb包&#xff0c;然后只需要在新机器使用dpkg -i安装即可。 二、命令 apt-get download $(apt-rdepends &#xff08;需要下载的包&#xff0c;可以有多个&#xff09; | grep -v "^ " | sed s/debconf-2.0/debco…...

Ubuntu中解/压缩命令

一、zip文件 #解压 unzip filename.zip #压缩 zip filename.zip dirname # 递归处理&#xff0c;将指定目录下的所有文件和子目录一并压缩 zip -r filename.zip dirname 二、tar文件 # 解压 tar xvf FileName.tar # 压缩&#xff0c;将DirName和其下所有文件(夹)打包非压…...

剑指 Offer 12. 矩阵中的路径(回溯 DFS)

文章目录 题目描述思路分析完整代码 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff…...

iceberg对比hive优势

1.事务性 从事务性上来说&#xff0c;iceberg具有更高的数据质量。 因为iceberg本质是一种table format&#xff0c;屏蔽了底层的存储细节&#xff0c;写入数据时候需要严格按照schema写入。而hive可以先写入底层数据&#xff0c;然后使用load partition的方式来加载分区。这样…...

ProgressBar基本使用

作用&#xff1a;进度条&#xff0c;用于展示某个任务的完成情况&#xff0c; 常用属性&#xff1a; 设定进度条的最大、最小值、自增步长 常用事件&#xff1a; 后台代码&#xff1a; private void progressBar1_Click(object sender, EventArgs e){Thread t;//使用线程执行…...

spring boot java使用XEasyPdf生成pdf文档

java使用XEasyPdf生成pdf文档 spring boot java使用XEasyPdf生成pdf文档第一步导入maven坐标,pom.xml全部贴上第二步编写代码代码实战&#xff1a; spring boot java使用XEasyPdf生成pdf文档 第一步导入maven坐标,pom.xml全部贴上 <?xml version"1.0" encoding…...

自定义elementui的主题

通常情况下&#xff0c;我们使用elementui框架的时候默认组件的主题都是白色的&#xff0c;比如&#xff1a; 但是如果想自定义主题&#xff0c;改变主题颜色&#xff0c;以及各种默认颜色&#xff0c;其实也不难&#xff1a; 配置默认主题&#xff0c;选好后点击下载 在vu…...

eNSP interface g0/0/0 报错解决办法

文章目录 1 报错截图2 解决办法2.1 排查设备是否有 GM 接口2.2 更换适合的路由器&#xff0c;并验证 1 报错截图 2 解决办法 2.1 排查设备是否有 GM 接口 查看下设备是否支持 GM 接口&#xff08;GigabitEthernet&#xff09; 方式一&#xff1a;右键路由器设备 - 设置 - 查看…...

Metric3D:Towards Zero-shot Metric 3D Prediction from A Single Image

参考代码&#xff1a;Metric3D 介绍 在如MiDas、LeReS这些文章中对于来源不同的深度数据集使用归一化深度作为学习目标&#xff0c;则在网络学习的过程中就天然失去了对真实深度和物体尺寸的度量能力。而这篇文章比较明确地指出了影响深度估计尺度变化大的因素就是焦距 f f f…...

k8s ingress获取客户端客户端真实IP

背景 在Kubernetes中&#xff0c;获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中&#xff0c;原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点&#xff1a; 安全性&#xff1a;基于客户端IP进行访问控制和认证授…...

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…...

AA-PEG-VE,AA-PEG-Vitamin E,用于修饰蛋白质、多肽以及其他含有氨基的材料

一.名称英文名&#xff1a;AA-PEG-VE&#xff0c;AA-PEG-Vitamin E&#xff0c;Acetic Acid-PEG-VE&#xff0c;Acetic Acid-PEG-Vitamin E&#xff0c;Vitamin E-PEG-AA中文名&#xff1a;乙酸聚乙二醇维生素E&#xff0c;乙酸-PEG-维生素E&#xff0c;维生素E-PEG-乙酸分子量…...

AI聚类算法的代码案例实现

AI聚类算法的代码案例实现...

ipmitool实战指南:从基础命令到高级服务器管理技巧

1. 初识ipmitool&#xff1a;服务器管理的瑞士军刀 第一次接触ipmitool是在五年前的一个深夜&#xff0c;当时机房有台服务器突然失去响应&#xff0c;运维同事却在外地出差。正当大家束手无策时&#xff0c;老张轻描淡写地说了句"用IPMI啊"&#xff0c;然后在笔记本…...

ai赋能开发:在快马平台用自然语言描述,自动生成java swing计算器代码

最近想用Java Swing开发一个图形化计算器&#xff0c;但作为初学者对Swing库不太熟悉。好在发现了InsCode(快马)平台&#xff0c;它内置的AI辅助开发功能帮我轻松解决了这个问题。整个过程就像有个编程助手在实时指导&#xff0c;特别适合我这种想快速实现功能但又不想深陷语法…...

实战指南:用LLNet深度学习模型提升夜间监控画质(附Python代码)

实战指南&#xff1a;用LLNet深度学习模型提升夜间监控画质&#xff08;附Python代码&#xff09; 夜间监控画质提升一直是安防和无人机航拍领域的核心挑战。当光线不足时&#xff0c;传统ISP&#xff08;图像信号处理器&#xff09;往往难以平衡亮度增强与噪声抑制&#xff0c…...

B站视频收藏难?开源工具BilibiliDown通过多线程技术实现批量下载,效率提升85%

B站视频收藏难&#xff1f;开源工具BilibiliDown通过多线程技术实现批量下载&#xff0c;效率提升85% 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址:…...

Plumbum部署指南:生产环境配置、安全与监控完整方案

Plumbum部署指南&#xff1a;生产环境配置、安全与监控完整方案 【免费下载链接】plumbum Plumbum: Shell Combinators 项目地址: https://gitcode.com/gh_mirrors/pl/plumbum Plumbum作为Python Shell Combinators库&#xff0c;为生产环境提供了强大的命令行执行和远程…...

intv_ai_mk11企业应用指南:将AI对话能力嵌入CRM系统提升客服响应效率

intv_ai_mk11企业应用指南&#xff1a;将AI对话能力嵌入CRM系统提升客服响应效率 1. 企业客服面临的挑战与AI解决方案 现代企业客服系统普遍面临三大痛点&#xff1a;响应速度慢、人力成本高、服务质量不稳定。传统CRM系统虽然能记录客户信息&#xff0c;但在实时交互环节仍需…...

Wan2.2-I2V-A14B效果展示:动态运镜+光影变化的高质量视频样例

Wan2.2-I2V-A14B效果展示&#xff1a;动态运镜光影变化的高质量视频样例 1. 惊艳的视频生成能力 Wan2.2-I2V-A14B文生视频模型带来了令人惊叹的视频生成效果。这个私有部署镜像经过深度优化&#xff0c;能够根据文字描述生成具有专业级动态运镜和光影变化的高质量视频。想象一…...

提升openclaw开发效率:用快马一键生成算法调试与可视化工具

最近在优化openclaw机械爪控制算法时&#xff0c;发现调试过程特别耗时。每次修改参数后&#xff0c;都要重新编译代码、运行测试&#xff0c;还要手动记录数据。为了提升效率&#xff0c;我用InsCode(快马)平台快速搭建了一个可视化调试工具&#xff0c;效果出乎意料的好。分享…...