c++和c语言动态内存分配

动态开辟内存,就是在堆区,可以根据自己的需要开辟和释放。(用完一定得释放) 

1.C语言

malloc和free 

1. (void*)malloc(size_t n);  // 传入一个需要开辟多少个字节的内存 (可以是一个常数,也可以是一个可以计算出的表达式),返回一个void*指针指向开辟内存的首地址。根据你存放数据的类型将返回指针强行转换成相应内存即可。

   要使用此函数得导入<stdlib.h>头文件使用此函数的开辟的内存,使用free()函数释放

int *a  = (int*)malloc(1024);//开辟1024个字节
free(a);
a = NULL;

上面代码,开辟了1kb的内存,存放int数据,所以要将其返回的void*指针强制转换为int*,返回赋值给指针a。试用结束,用free()释放这片内存。 

因为,我们释放了内存之后,但是指针a还存在,因为它指向的内存已经释放,我们是万万不能再去访问它,所以为了保险起见,释放完内存之后,将它指向NULL; 

2.c++ 

 new和delete

c++中动态开辟内存使用new运算符。

int* test; // 定义一个指针,可以指向一片空间
int (*test1)[5]; // 定义一个指向二维数组的指针test = new int;   //使用new申请一个int空间 
test = new int(10);  // 使用new开辟一个int空间并且初始化为10delete test; // 释放内存直接使用deleteint nub = 10;
test = new int[nub];  // 使用new申请nub个int类型的连续空间
test1 = new int[nub][5]; // 使用new申请一个nub行5列的二维数组。// 必须是使用一个指向二维数组的指针才可以,所以使用test是不行的// 只有第一个[]可以使用变量及相关表达式。第二个[]只能使用常量和常量表达 式//使用下面形式释放一片空间([]号中不需要写多少,因为os有标记)
delete[] test;
delete[] test1; // 注意:在使用delete释放申请到的内存时,必须使用我们用于指向这片内存(首地址),也就是我们申请内存
// 时,用于指向这片内存的指针,--在本例中为:test和test1,不可以是test+1等。

上面的代码就使用了new和delete运算符来实现动态内存分配的。  

 

3. delete和free可以交替使用 

意思是,使用malloc函数申请的内存可以通过delete释放。 

            使用new运算符申请的内存可以通过free释放。 

int *m_pointer = (int *)malloc(1024); // 申请1kbdelete[] m_pointer;  // 使用delete释放int *n_pointer = new int; // 申请4个字节free(n_pointer); // 使用free释放

 

4. mallloc,free和new,delete的对比(在c++中建议使用后者) 

因为,malloc和free都是函数,有调用上的开销。而c++中new和delete是运算符,所以new和delete的效率要高于malloc和free,所以我们平时在c++中建议使用后者。 

因为c++完全兼容C语言,所以也可以使用malloc和free来实现。 

 

5. 使用动态分配内存的好处 

好处一:  我们可以根据自己的需要来积极申请内存,可以减少一定的内存损耗。 

比如:我们平时需要输入一组数据,因为我们最开始不知道这组数据的数量,之前我们可以定义一个数组来存储,但是数组不支持变量定义和动态变化-----所以我们只能将数组定义的尽可能的大一点。 

int a[1024];   当我们定义一个这样的数组时,我们可能只需要放十个数据在里面,这样就浪费了很多空间。 

使用动态分配存储的内存就可以降低这种的损耗。 

 

好处二:可以使程序有更多可以使用的内存。 

我们平时写程序时,一些局部变量等在栈中存储,但是栈内存是有限的,windows可能是1M-2M(因为要给别的程序预留),而如果我们想要创建使用很大一片内存,这时候,就可以从堆中使用, 堆的空间1G-2G一般。 

 

好处三:我们可以自己控制它的生命周期--使得到其他函数中的内容成为可能。 

1. 堆区内存的生命周期  ----   从申请成功开始到释放。(这个过程是我们可以控制的) 。

2. 因为我们平时使用函数返回一个指针(变量地址)时,往往是不可以返回局部变量的,因为函数调用结束之后该变量对应的内存就被回收了,你再去访问那不就出问题了。 

如果想要返回函数内的创建的内存: 1. 使用static定义变量    2. 使用动态开辟的内存(未释放的) 

6. 使用动态内存分配的风险 -- 内存泄漏 

内存泄漏:    我们申请了内存,但是我们不使用,os也不知道,这其实就是内存泄漏。 

我们动态申请的内存使用完一定要释放掉,如果不释放,你不使用它,os又不知道,你再次去申请内存,一直不释放,就会导致很多空间浪费了,可使用的内存也会逐渐降,直到程序崩溃。 

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

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

相关文章

Maven之依赖的传递

问题导入 1. 依赖传递 A依赖B&#xff0c;B依赖C&#xff0c;A是否依赖于C呢&#xff1f;–A依赖于C 依赖具有传递性 路径优先&#xff1a;当依赖中出现相同的的资源时&#xff0c;层级越深&#xff0c;优先级越低&#xff0c;层级越浅&#xff0c;优先级越高 声明优先&…

nacos 2.* 部署在linux服务器无法注册问题

通过sdk注册代码 报错 Exception in thread "main" ErrCode:-401, ErrMsg:Client not connected, current status:STARTING at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:639) at com.alibaba.nacos.common.remote.client…

【网络编程】——基于TCP协议实现回显服务器及客户端

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、TCP实…

AI无人直播系统怎么样?三点说明

近年来&#xff0c;因为科技的高速进步&#xff0c;不断涌现出了越来越多的新技术和创新事物&#xff0c;它们以其独特的方式取代了我们的许多传统做法&#xff0c;从而彻底解放了我们的双手。在这股潮流中&#xff0c;无人直播作为一种创新形式&#xff0c;使得直播变得更加简…

安装部署halo博客

Docker 安装文档&#xff1a;https://docs.docker.com/engine/install/ Docker Compose 安装文档&#xff1a;https://docs.docker.com/compose/install/ mkdir ~/halo && cd ~/halotouch ~/halo/docker-compose.yamlvim application.yaml application.yaml version:…

时间序列系列04-时间序列间因果关系

挖掘时间序列间的因果关系是时间序列分析中的一个重要任务&#xff0c;它有助于理解变量之间的动态关系、预测未来趋势以及发现潜在的影响因素。以下是一些常用的方法和技术&#xff1a; 多维时间序列变量的因果推断 1. 格兰杰因果关系检验&#xff08;Granger Causality Test…

[go 面试] 分布式事务框架选择与实践

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 分布式事务是处理跨多个服务的原子操作的关键概念&#xff0c;而选择适合应用场景的框架对于确保事务一致性至关重要。以下是几个…

【容器】K8s RBAC介绍

认识RBAC RBAC&#xff08;基于角色的访问控制&#xff09;是一种将权限分配给用户和服务的方法&#xff0c;基于他们的角色来确定他们可以访问和修改的资源。K8s使用RBAC作为来访请求鉴权的机制之一。 场景&#xff1a;访问K8s接口时的认证和鉴权 某些场景下&#xff0c;我…

面试算法98:路径的数目

题目 一个机器人从mn的格子的左上角出发&#xff0c;它每步要么向下要么向右&#xff0c;直到抵达格子的右下角。请计算机器人从左上角到达右下角的路径的数目。例如&#xff0c;如果格子的大小是33&#xff0c;那么机器人从左上角到达右下角有6条符合条件的不同路径。 分析…

rabbitmq延时队列相关配置

确保 RabbitMQ 的延时消息插件已经安装和启用。你可以通过执行以下命令来安装该插件&#xff1a; rabbitmq-plugins enable rabbitmq_delayed_message_exchange 如果提示未安装&#xff0c;以下是安装流程&#xff1a; 查看mq版本&#xff1a; 查看自己使用的 MQ&#xff08;…

全网最全丨傻瓜式Fiddler教程大全丨从安装到抓包

前言 在我们做接口测试的时候&#xff0c;经常需要验证发送的消息是否正确&#xff0c;或者在出现问题的时候&#xff0c;查看手机客户端发送给server端的包内容是否正确&#xff0c;就需要用到抓包工具。 今天&#xff0c;给大家带来最常用的Fiddler的傻瓜式教程大全——从安…

Python中的并发编程技术与实践分享

一、并发编程的概念与重要性 并发编程是计算机科学中的一个重要概念&#xff0c;它涉及到在同一时间内处理多个任务的能力。在多核CPU和云计算日益普及的今天&#xff0c;并发编程变得越来越重要。通过并发编程&#xff0c;我们可以充分利用系统资源&#xff0c;提高程序的执行…

九、综合实例:修改用户资料(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 设计一个修改用户资料功能的对话框&#xff0c;要求包含基本信息、联系方式、详细资料的编辑和修改。本实例只实现界面。 二、实现代码 导航页面&#xff1a; //添加的头文件 #include <QStacked…

2401C++,实现文件服务器和聊天室

文件服务器 使用yalantinglibs,几行代码开发静态文件服务器 最近的workshop上的一个任务,就是实现一个文件服务器,只要设置下载目录之后,就可下载目录里面的文件. 看看用yalantinglibs怎么实现一个静态文件服务器的吧. coro_http::coro_http_server server(1, 9001); server.…

深入理解Python中的二分查找与bisect模块

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

安装Cygwin的包管理器apt-cyg并安装tree命令

文章目录 一、从官网添加必要软件包1. 安装2. 检查 二、安装apt-cyg1. 下载安装2.修复 三、安装tree命令1. 安装2.检验 一、从官网添加必要软件包 1. 安装 因为第一次安装cygwin时走的都是默认选项&#xff0c;所以这里是二次添加额外包。 打开官网&#xff0c;下载安装程序。…

【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】

【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】 一、导出虚拟机二、导入虚拟机三、启动数据库四、使用Data Studio连接数据库 一、导出虚拟机 选择关机状态的虚拟机 -> 管理菜单 -> 导出虚拟电脑 点击完成后&#xff0c;需要等待一小段时间&#xff0c;如…

JS实现/封装节流函数

封装节流函数 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次 let timer, flag; /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次* * param {Function} func 要执行的回调函数 * param {Number} wait 延时的时间* param {Boolean} immediate 是否立…

每日一道算法题day-three(备战蓝桥杯)

哈喽大家好&#xff0c;今天来给大家带来每日一道算法题系列第三天&#xff0c;让我们来看看今天的题目&#xff0c;一起备战蓝桥杯 题目&#xff1a; 小 Y的桌子上放着 n 个苹果从左到右排成一列&#xff0c;编号为从 11 到 n。 小苞是小 Y 的好朋友&#xff0c;每天她都会…

HAproxy群集

HAproxy群集 常见的集群调度器HAproxy 、nginx、LVS区别HAproxynginxlvs HAproxy介绍HAproxy特点HAproxy常见的负载均衡策略HAproxy会话保持HAproxy配置实例 常见的集群调度器 常见的web集群调度器分为软件和硬件 软件&#xff1a;LVS Haproxy nginx 硬件&#xff1a; F5 Ar…