C++指针解读(10)-- 动态内存分配

news2025/1/11 23:56:41

栈和堆是进程内存空间中非常重要的2块区域。栈用于存放程序临时创建的局部变量;堆用于存放进程运行中被动态分配的内存段。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上;当利用free等函数释放内存时,被释放的内存从堆中被剔除。

1、C动态内存分配

C语言动态内存分配相关的库函数有以下几个:

malloc、calloc、realloc、free这4个函数。

(1)malloc

void *malloc(unsigned int size);

函数的作用是分配一个长度为size个字节的连续空间。函数的返回值是所分配区域的第一个字节的地址。

如果函数未能成功地执行,则返回空指针NULL。

int* pv = (int*)malloc(5*sizeof(int));
if(pv != NULL){ //先检查函数调用是否成功
    for (int i = 0; i < 5; i++) {
        pv[i] = i + 1;
    }
}

(2)calloc

void *calloc(unsigned n, unsigned size);

函数的作用是分配n个长度为size个字节的连续空间,并同时清空内存。可用来给数组开辟动态存储空间。

int *p = (int*)calloc(8, 4);

分配8*4个字节的存储空间。

如果用malloc来达到同calloc的效果,则代码需要这么写:

int *p = (int*)malloc(8*4); //malloc不会清空内存,可调用memset清空内存
memset(p, 0, 8*4);

(3)realloc

void *realloc(void *p, unsigned int size);

如果已经通过malloc函数或calloc函数分配了空间,想改变其大小,可以用realloc函数重新分配。

int* pi = (int*)calloc(8, 4);
*pi = 4;
*(pi + 1) = 5;
printf(" %d\n", *(pi + 1)); //输出5

realloc(pi, 64);
printf(" %d\n", * (pi + 1)); //输出5。所以realloc不会破坏原来存储的数据

return 0;

realloc函数要点总结:

(3.1)realloc函数可以扩大存储空间,也可以缩小存储空间。

(3.2)realloc函数重新分配了新地址,旧指针无需调用free。

(3.3)一定不要这样调用:ptr = realloc(ptr, size),这样会使原来的ptr丢失而导致内存泄漏。

(3.4)如果调用realloc失败,返回NULL;但原内存空间不受影响。

(3.5)realloc很耗资源,能不用就不用。

(4)free

void free(void *ptr);

函数的参数是指向由malloc、calloc、realloc函数分配的内存地址,调用后这块内存返回给堆空间。

int *pi = (int*)malloc(4);
...
free(pi);

调用free函数后,指针pi指向的内存空间被释放,但指针pi依然指向这块已被释放的地址。

此时,需要把NULL赋给指针pi:pi = NULL

重复free置为NULL的指针不会出错,但重复free非NULL指针一定会报错。

int* pi = (int*)calloc(8, 4);
free(pi);

pi = NULL;
free(pi); //重复free不会报错
free(pi); //重复free不会报错

2、C++动态内存分配

(1)new、delete

C++中通过new关键字进行动态内存申请,用delete关键字进行内存释放。

malloc、calloc、realloc函数是按字节数分配存储空间的;

但用new内存分配是基于类型进行的。

int* pi = new int(1); //分配内存时把值初始化为1
delete pi;

int* pv = new int[10];
delete[] pv;

(2)new关键字与malloc函数的区别

new关键字

malloc函数

new关键字是C++的一部分

malloc是由C库提供的函数

new以具体类型为单位进行内存分配

malloc以字节为单位进行内存分配

new在申请单个类型变量时可进行初始化

malloc不具备内存初始化的特性

(3)动态内存分配异常机制

用malloc分配内存空间可能会失败,用new分配内存空间也可能失败。C++提供了两种标准机制来检查分配是否成功。

(3.1)bad_alloc异常

默认情况下,在分配失败时会抛出bad_alloc类型的异常,如果此异常未处理,则程序终止。

int* pv = new int[10];

(3.2)nothrow

使用nothrow后,在内存分配失败时,不抛出bad_alloc异常;此时new返回的空指针。

int* pv = new (nothrow) int[10];
if (pv != nullptr) {
    ... ...
}

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

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

相关文章

虚拟机和Windows共享文件的几种方式(共享文件夹、网络映射、Winscp)

1、共享文件夹 在虚拟机的“/mnt/hgfs/”目录下能看到和Windows共享的文件&#xff1b; 2、网络映射 2.1、安装samba服务器 #安装samba服务器 apt-get install samba samba-common#添加samba账户 smbpasswd -a ckl passwd:1232.2、设置网络映射 3、Winscp共享文件 3.1、Wins…

snk-给github界面加一个有趣的动画

How to enable GitHub Actions on your Profile README for a snake-eating contribution graph &#x1f40d; - DEV Community Platane/Platane (github.com) ① 创建New repository 名字和你自己的Github 用户名一样。 ② 创建之后&#xff0c;再这个Zero-coder仓库下创建…

[C国演义] 第十五章

第十五章 最长湍流子数组环绕字符串中唯⼀的⼦字符串 最长湍流子数组 力扣链接 子数组 ⇒ dp[i]的含义: 以arr[i] 结尾的所有子数组中的最长湍流子数组的长度 子数组 ⇒ 状态转移方程根据 最后一个位置来划分&#x1f447;&#x1f447;&#x1f447; 初始化: 都初始化为…

任务调度框架-如何实现定时任务+RabbitMQ事务+手动ACK

任务调度框架 Java中如何实现定时任务&#xff1f; 比如&#xff1a; 1.每天早上6点定时执行 2.每月最后一个工作日&#xff0c;考勤统计 3.每个月25号信用卡还款 4.会员生日祝福 5.每隔3秒&#xff0c;自动提醒 10分钟的超时订单的自动取消&#xff0c;每隔30秒或1分钟查询…

Gson反序列化原理

前言 序列化和反序列化是日常工作中经常使用的工具&#xff0c;一般用于对象的持久化保存或者对象的网络传输&#xff0c;一般有两种情况&#xff0c;一种是对象本身实现了Serializable接口&#xff0c;这种情况下可以利用jdk自带的功能或者Kryo等这种封装好的序列化反序列化工…

10.Linear Map transformation rules

线性映射 从一个基底到另一个基底 所遵循的转换规则。 假设&#xff1a; 由一个矩阵给出的线性映射在这&#xff0c;并且是在基底e上表示&#xff0c; 该线性映射将e1变成0.5个e1&#xff0c;将e2变成2个e2&#xff1b; 假设有个向量V&#xff0c;其分量是【1&#xff0c;1…

福昕阅读器打开pdf文档时显示的标题不是文件名

0 Preface/Foreword 1 现象 文件名为&#xff1a;Demo-20231017 打开效果&#xff1a;显示名字为 word template 2 解决方法 2.1 利用打印方式将word生产pdf 在word生产pdf文件时&#xff0c;使用打印方式生成pdf文档。 2.2 删除word文档设置的标题 文件---》信息---》标…

“赔率”和“概率”

赔率与概率不同 Odds ! Probability 许多人将“赔率”和“概率”这两个词混为一谈。它们都表示对可能性或机会的估计。我可以理解普通人这样做&#xff0c;但我经常看到数据科学家和统计学家也混淆了这些概念&#xff0c;这是一种遗憾&#xff0c;因为在数学上它们有不同的含…

LVGL_基础控件btnmatrix

LVGL_基础控件btnmatrix 1、创建按钮矩阵 /* 分配按钮以及按钮上的文字 */ // 这里注意不要使用在函数退出时会被销毁的局部变量 // 可以用 "\n" 进行换行&#xff0c;最后一个按钮之后的元素必须是 NULL 或 "" // 换行 "\n" 和 "NULL&quo…

Z-Fighting问题解决(二) - Reverse-z

Z值相关技术概论理清 开始之前先简单理清科普一下涉及的跟三维图形学相关的深度Z相关的概念&#xff1a; Z-Buffer&#xff1a;上个世纪八十年代的图形学飞跃节点算法之一&#xff1b; Z缓冲是一种解决深度排序问题的方法&#xff0c;主要用于确定哪些物体在其他物体的前面。…

【Oracle】分析函数partition by,解决了使用group by后select语句中只能是分组的字段或者是一个聚合函数的问题

首先我们看一下group by的用法&#xff0c;比如根据省份分组。 select province, sum(persons) from t_person group by province;使用了group by后&#xff0c;select语句中只能是分组的字段&#xff08;比如上面的province&#xff09;或者是一个聚合函数&#xff08;比如co…

【特纳斯电子】基于单片机的火灾监测报警系统-仿真设计

视频及资料链接&#xff1a;基于单片机的火灾监测报警系统-仿真设计 - 电子校园网 (mcude.com) 编号&#xff1a; T0152203M-FZ 设计简介&#xff1a; 本设计是基于单片机的火灾监测报警系统&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示温度、烟雾、是否有火…

jenkins pipeline使用

1、jenkins全局配置 1.1、maven配置 1.2、jdk配置 1.3、git配置 2、构建环境配置 2.1、安装时间插件 Date Parameter 2.2、Git Parameter 插件安装 3、pipeline如下 pipeline {agent anyenvironment {image_name "192.168.122.150/ken-test/price-service:${date}&…

jmeter监控服务器的资源使用

一. 下载安装包SeverAgent-x.x.x.zip并安装到被监控服务器 下载地址&#xff1a;https://github.com/undera/perfmon-agent 下载完解压后执行运行&#xff0c;windows运行startAgent.bat, linux运行startAgent.sh 二. 在jmeter上添加插件jpgc-PerfMon Metrics Collector监听器…

电商API接口的发展,电商API接口主要应用场景:

随着互联网技术的不断进步和电商行业的迅猛发展&#xff0c;电商API接口在商品交易、物流配送、客户服务等方面发挥着越来越重要的作用。本文将深入探讨电商API接口的技术原理、应用场景、开发方法以及优缺点。 一、技术原理 电商API接口是基于HTTP、TCP、IP等网络协议实现的…

代码随想录二刷 Day41

509. 斐波那契数 这个题简单入门&#xff0c;注意下N小于等于1的情况就可以 class Solution { public:int fib(int n) {if (n < 1) return n; //这句不写的话test能过但是另外的过不了vector<int> result(n 1); //定义存放dp结果的数组&#xff0c;还要定义大小r…

基于复合优化加速算法研究实际问题

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.5.0加载hybird.nesterov.accer方法 import optimtool.hybrid as oh nes_acc oh.nesterov.accer初始化输入数据 f ( x ) ∑ i 1 n ( ( n − ∑ j 1 n cos ⁡ x j ) i ( 1 − co…

jenkins出错与恢复

如果你的jenkins出现了如下图所示问题&#xff08;比如不能下载插件&#xff0c;无法保存任务等&#xff09;&#xff0c;这个时候就需要重新安装了。 一、卸载干净jenknis 要彻底卸载 Jenkins&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1、停止 Jenkins 服务&…

学信息系统项目管理师第4版系列29_信息系统治理

1. IT治理 1.1. 描述组织采用有效的机制对信息技术和数据资源开发利用&#xff0c;平衡信息化发展和数字化转型过程中的风险&#xff0c;确保实现组织的战略目标的过程 1.2. 驱动因素 1.2.1. 信息孤岛 1.2.2. 信息资源整合目标空泛 1.3. 高质量IT治理因素 1.3.1. 良好的I…

flask基础开发知识学习

之前做了一些LLM的demo&#xff0c;接口用flask写的&#xff0c;但是涉及到后端的一些业务就感觉逻辑写的很乱&#xff0c;代码变成屎山&#xff0c;于是借助官方文档和GPT迅速补了一些知识&#xff0c;总结一下一个很小的模板 于是决定边学边重构之前的代码… 文章目录 代码结…