C++中的内存管理(上)

news2024/9/25 17:21:30

一、C++中的内存分布

我们先来看下下面的代码:

int globalvar = 1;
static int staticGlobalvar = 1;
void test()
{
	static int staticVar = 1;
	int localvar = 1;

	int num1[10] = { 1, 3, 2, 4 };
	char char2[] = "abcd";
	const char* pChar3 = "abcd";
	int* ptr1 = (int*)malloc(sizeof(int) * 4);
	int* ptr2 = (int*)calloc(4, sizeof(int));
	int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
	free(ptr1);
	free(ptr3);

}

关于C/C++中的内存分布大致是这样的:

1.全局变量和静态变量(static修饰的变量)存在静态区

2.常量存在常量区

3.局部变量以及const修饰的变量存在于栈中

4.使用malloc等动态开辟的内存存在于堆中

按照上面的结论,我们就知道了,globalvar是一个全局变量是存在静态区的(静态区也称为数据段),staticGlobalvar是静态变量也是全局变量,因此存在静态区中,staticVar是局部静态变量也是在静态区中,localvar是局部变量在栈空间中,num1是我们定义的数组,但不是动态开辟的因此它也是由系统自动开辟和回收的因此它也是存在于栈中,char2数组同理,*char2也是存放在栈中,pChar3同理,但是*pChar3 是被const修饰的具有常性,存放在常量区(代码段),ptr1 是一个指针变量,存放在栈空间中,*ptr1指向我们malloc出的空间,存在于堆中。

C++中的内存分布:

1.栈又叫做堆栈,存放非静态局部变量/函数参数/返回值等等,栈是向下增长的

2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可以使用系统接口创建共享内存,做进程间通信。

进程:我们先出的程序运行起来后叫做进程

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

4.数据段,又叫做静态区,存储全局数据和静态数据

5.代码段,又叫做常量区,存储可执行的代码和只读常量

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

我们来看下下面的实例代码:

void test1()
{
	//开辟4个整型大小的空间
	int* p1 = (int*)malloc(sizeof(int) * 4);
	free(p1);
	//开辟4个整型的空间然后将它们初始化成0
	int* p2 = (int*)calloc(4, sizeof(int));
	//realloc函数用来扩容,如果原来位置后面有足够空间就直接在后面扩
	//如果后面位置的内存不够,就在新开辟一块内存然后将原来的内容拷贝过去,并且realloc自动释放原来的空间
	int* p3 = (int*)realloc(p2, sizeof(int) * 10);

	//这里不需要释放p2,因为在扩容时realloc函数已经将p2给释放了
	free(p3);
}

 对于上面三种开辟函数,我在上面代码的注释了介绍了,在这里就不再多说了,下面我们来看一下C++中的内存管理方式。

三、C++中的内存管理方式

对于C语言中的内存管理方式,在C++中是可以继续使用的,但是有些地方用起来就比较乏力,而且比较麻烦,于是C++就提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理

3.1 new/delete操作内置类型 

我们来看下面的代码:

void test()
{
	//动态申请一个int的空间
	int* ptr4 = new int;

	//动态申请一个int类型的空间并初始化为10
	int* ptr5 = new int(10);

	//动态申请6个int类型的空间
	int* ptr6 = new int[6];

	//释放空间
	delete ptr4;
	delete ptr5;
	//多个对象的释放使用delete[];
	delete[] ptr6;
}

C++中的new和delete和C中的malloc与free,除了使用方法上的区别外,其他方面基本没有区别,new申请的对象默认不会进行初始化,但是可以初始化,初始化的方法如下所示:

//单个对象的初始化
int* ptr7 = new int(11);

//多个对象的初始化
int* ptr8 = new int[3] {1, 2, 3};

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

3.2 new和delete操作自定义类型

先来看下下面的代码:

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
	int _a;
};

void test1()
{
	//new/delete 和 malloc/free 最大的区别就是 new/delete对于自定义类型除了开空间之外还会调用构造函数和析构函数
	A* p1 = (A*)malloc(sizeof(A));
	A* p2 = new A(1);
	//需要配套使用
	free(p1);
	delete p2;

	//对于内置类型基本是一样的
	int* p3 = (int*)malloc(sizeof(int));
	int* p4 = new int;

	free(p3);
	delete p4;

	A* p5 = (A*)malloc(sizeof(A) * 10);
	//调用10次构造函数
	A* p6 = new A[10];

	free(p5);
	//每个对象都调用一次析构函数
	delete[] p6;
}

int main()
{


	test1();

	return 0;
}

下面是代码运行结果:

 可以看出这里调用的次数和我们预想的是一样的。

注意:自定义类型使用malloc开辟的话无法进行初始化,new可以调用默认构造或者带参的构造函数,而且,new出的对象不是匿名对象。匿名对象的声明周期仅在它所在的那一行。

delete会析构掉那个对象,而free不会调用析构函数

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

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

相关文章

常见的零拷贝技术

传统IO 基于传统的IO方式&#xff0c;底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区&#xff0c;再复制到用户缓冲区&#xff1b;然后再通过write()写入到socket缓冲区&#xff0c;最后写入网卡设备。整个过程发生了4次用户态和内核态的上…

【前端开发---Vue2】史上最详细的Vue入门教程(五) --- 细讲‘生命周期’

什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09;&#xff0c;本篇将详细讲解vue中的核心 --- 生命周期&#xff0c;并提供具体案例来让小伙伴们加深理解、彻底掌握…

# 从浅入深 学习 SpringCloud 微服务架构(九)

从浅入深 学习 SpringCloud 微服务架构&#xff08;九&#xff09; 一、微服务网关引入 1、在微服务架构中&#xff0c;不同的微服务一般会有不同的网络地址&#xff0c; 如果让客户端直接与各个微服务通讯&#xff0c;可能会有很多问题&#xff0c;如&#xff1a; 1&#…

AI适老化!10秒一张的AI姓氏头像,居然要卖9块9?中老年用户都说好!

看短视频的你&#xff0c;一定会刷到过这样的直播间&#xff1a; 现在大家明白了&#xff0c;这是一个做姓氏图像的直播间。我刚开始刷到的时候也觉得这种头像好看&#xff0c;高大上&#xff0c;也想做一个这样的图像&#xff0c;来当自己的微信头像。 做这样的图像需要排队刷…

Jenkins自动化搭建记录

每一份努力都是有一份期盼&#xff0c;每一份付出都是为了有更多的收获。 本文记录一次搭建Jenkins自动参数化打包APK的实现过程和碰到的问题&#xff0c;实现了在Windows和Mac系统下的自动化打包流程。 因为Jenkins的安装过程在网上的教程很多&#xff0c;这里就不在赘述。 …

手动实现简易版RPC(三)

手动实现简易版RPC(三) 往期内容 手动实现简易版RPC&#xff08;一&#xff09;&#xff1a;RPC简介及系统架构 手动实现简易版RPC&#xff08;二&#xff09;&#xff1a;简单RPC框架实现 前言 接上两篇博客我们实现了最简易RPC框架&#xff0c;接下来的几期重点在简易版…

深入解析C#特殊字符:概念、分类与使用方法

文章目录 前言一、特殊字符的定义二、特殊字符的分类与作用1.转义字符2. 格式字符3. 逻辑运算符4. 运算符5. 字符串6. 注释 三、$&#xff1a;字符串内插&#xff08;String Interpolation&#xff09;四、&#xff1a;逐字字符串&#xff08;Verbatim Strings&#xff09;五、…

ai绘画的今天,新人还能入行吗?

现在24年了&#xff0c;大趋势已经很明显&#xff0c;ai绘画现阶段处于如日中天的时候&#xff0c;无论是绘画&#xff0c;电商&#xff0c;小说推文。等等一系列的行业都能用到ai绘画&#xff01; 说明一下&#xff0c;我自己就是23年初偶然间刷到了ai绘画这个赛道&#xff0c…

SpringDI方式及Redis应用场景的分享

1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示&#xff0c;在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的)&#xff1b;但是使用Resource却不会…

Git笔记-常用指令

Git笔记-常用指令 一、概述二、仓库管理二、缓存区操作1. 添加文件到缓存区2. 取消缓存文件3. 忽略列表 三、日志状态信息四、分支操作五、六、 一、概述 这里记录一些git常用的指令。 二、仓库管理 # 本地仓库初始化 git init# 克隆仓库 git clone git_url # git clone ht…

wordpress子比主题给文章内容加上密码查看

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤1.引入库2.读入数据第三步:文章内添加代码前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,…

三维重建(SFM)与实时定位建图(SLAM)的区分与联系

1、SLAM SLAM是Simultaneous Location and Mapping&#xff0c;同时定位与地图构建。是指搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动。目的是解决自主机器人“定位”和“建图”两个问题…

Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述&#xff1a; 由于某些情况下当查询过滤参数过大时&#xff0c;执行sql由于参数过大而报错&#xff0c;此时 需要使用临时表的方式&#xff0c;即 当参数超过某个阀值&#xff08;如 1000&#xff0c;可调整&#xff09;新增一张临时表&#xff0c;将原表 与 该临时表进…

Vue3+vite优化基础架构(3)--- 优化vue-i18n国际化配置

Vue3vite优化基础架构&#xff08;3&#xff09;--- 优化vue-i18n国际化配置 说明全部页面进行中英文使用测试中英文切换对ElementPlus里面的所有组件进行中英文切换 说明 这里记录下自己在Vue3vite的项目增加全局中英文切换按钮对页面进行中英文切换及同时对ElementPlus里面的…

stm32单片机开发五、I2C通信

I2C这部分的时序单元可以看我另外一篇博客I2C基本知识 I2C发送数据时是高位先行&#xff0c;也就是先发送高位的&#xff0c;比如一个字节有8位B0-B7&#xff0c;先发送B7高位 I2C用的是同步时序&#xff0c;它有一个好处&#xff0c;比如传输过程中&#xff0c;出现了中断&…

深度学习之基于Pytorch姿态估计的仰卧起坐计数系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 仰卧起坐作为一种常见的健身动作&#xff0c;被广泛用于腹部肌肉的锻炼。然而&#xff0c;对于仰卧起…

(四)机器学习在银行中的典型应用场景(模型) #CDA学习打卡

本文总结了机器学习在银行中的典型业务应用场景&#xff0c;包括客户管理、零售智能营销、公司智能营销、自然语言处理、运营管理以及图像识别。

智慧园区sip对讲广播解决方案

智慧园区sip对讲广播解决方案18123651365 目前而言智慧园区管理者主要需要解决的问题是&#xff1a; 1.面对庞大的园区小区规模&#xff0c;能源管理全部依赖人工已经无法实现&#xff1b; 2.节能管理工作难度大&#xff0c;面对问题&#xff0c;没有好的解决方案&#xff1b; …

pyqt6的安装,使用-1

pyqt6安装的话&#xff0c;在自己所用的环境里安就可以&#xff0c;之前写有yolov5,yolov8的环境配置&#xff0c;python3.8的我安装就没有问题&#xff0c;打开anaconda&#xff0c;激活自己的环境 把这复制进去 pip install pyqt6 pip install pyqt6-tools 这个安装完了之后…

【JavaWeb】网上蛋糕项目商城-关键字搜索,购物车以及商品详情功能

概念 上文中已经实现热销和新品的商品列表功能&#xff0c;本文篇幅中实现关键字搜索商品&#xff0c;将商品加入购物车&#xff0c;以及查看商品的详情信息等功能 关键字搜索实现步骤 在head.jsp头部页面中&#xff0c;鼠标移动至搜索图标会显示隐藏的搜索框进行输入关键信…