【带头学C++】----- 四、动态内存空间申请 ---- 4.1 动态内存分配

news2025/1/14 18:03:31

1.动态内存分配概述

       在C和C++等语言中,可以使用malloc、calloc、realloc或使用new等函数来动态分配内存空间,同时使用free、delete函数释放动态分配的内存空间,这样可以根据程序的实际需要动态管理内存,避免静态内存分配的局限性。

       在数组一章中,我们讨论了数组的长度是在编程时预先定义好的,其大小在整个程序中都是固定的,无法动态改变。然而,在实际的编程中,我们经常会遇到一种情况,即所需的内存空间取决于实际输入的数据,而无法事先确定。为了解决这个问题,C++语言提供了一些关键字和函数,可以按需动态分配内存空间,并且可以在不再需要时回收和重复利用。

2.静态分配和动态分配

2.1 静态分配

      静态分配在编译时或程序运行之初为变量、数组或对象分配固定大小的内存空间。静态分配的空间大小固定,无法动态改变。

      静态分配速度快,但空间大小固定;动态分配灵活性高,但需要程序员手动管理内存申请和释放。

1、在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a[10]
2、必须事先知道所需空间的大小。
3、分配在栈区全局变量区,一般以数组的形式

2.2 动态分配

      动态分配在程序运行时根据需要动态地为变量、数组或对象分配内存空间。动态分配的空间大小可以根据运行时需求进行调整,并且可以在不再使用时释放内存空间以便重复利用。

1、在程序运行过程中,根据需要大小自由分配所需空间
2、按需分配。
3、分配在堆区,一般使用特定的关键字进行分配

3.new 和 delete关键字

new申请堆区空间    delete释放空间

new关键字

  • 动态分配内存:使用new关键字可以在堆上动态地分配内存,以创建对象或数组。语法如下:

    int *ptr = new int; // 动态分配一个整数大小的内存空间,并将其地址赋给ptr指针
    

    这行代码会在堆上分配足够的内存以存储一个整数,并将该内存的地址赋给指针ptr

  • 对象构造:如果你使用new来创建一个类的实例,C++会自动调用构造函数来初始化这个新对象。

delete关键字

  • 释放动态内存:使用delete关键字释放先前使用new动态分配的内存。语法如下:

    delete ptr; // 释放先前动态分配的内存,ptr是之前使用new分配的指针
    

    这行代码会释放ptr所指向的动态分配的内存空间,并将该内存空间返回给系统。

  • 对象销毁:如果你使用new来创建一个类的实例,在释放相应的动态内存时,C++会自动调用析构函数对对象进行清理。

示例

// 使用new关键字动态分配一个整数数组
int *arr = new int[5];

// 使用delete关键字释放动态分配的数组内存
delete[] arr;

注意事项

  • 在使用new分配内存后,务必在不再需要这部分内存时使用delete释放它,以避免内存泄漏。
  • 如果使用new动态分配了一个数组,应当使用delete[]来释放内存,以确保释放整个数组所占用的内存空间。

1.new和delete操作基本类型空间

注:new和delete需要成对出现,申请完必须释放,否则容易造成内存泄漏

 可以在申请空间的时候,初始化空间的内容。

 

         这里,在千峰教育C++基础知识视频课程中的案例中。老师应该是打错了,输出的时候应该是把p1输出,而不是p输出。注意这里的delete p之后没有置空,实际上是访问了之前分配的内存空间,这是一种未定义行为。这种情况下,即使指针指向的内存已经被释放,它们仍然保留了之前分配的地址。这就是为什么你可以看到似乎已经被释放的内存值仍然被打印出来。

2.new和delete操作数组空间

new申请空间的时候携带[ ]表示申请数组空间,delete释放的时候也需要带上[ ]

 

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

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

相关文章

Windows查看端口占用情况

Windows如何查看端口占用情况 方法1. cmd命令行执行netstat命令,查看端口占用情况 netstat -ano 以上命令输出太多信息,不方便查看,通过如下命令搜索具体端口占用情况,例如:8080端口 netstat -ano | findstr "…

STM32--时钟树

一、什么是时钟? 时钟是单片机的脉搏,是系统工作的同步节拍。单片机上至CPU,下至总线外设,它们工作时序的配合,都需要一个同步的时钟信号来统一指挥。时钟信号是周期性的脉冲信号。 二、什么是时钟树? S…

可视化技术专栏100例教程导航帖—学习可视化技术的指南宝典

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文专栏:可视化技术专栏100例 可视化技术专栏100例领略各种先进的可视化技术,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章…

两两交换链表中的节点 --- 递归回溯算法练习四

目录 1. 分析题意 2. 分析算法原理 2.1. 递归思路: 1. 挖掘子问题 3. 编写代码 3.1. step 1: 3.2. step 2: 3.3. step 3: 3.4. 递归代码 1. 分析题意 力扣上原题链接如下: 24. 两两交换链表中的节点 - 力扣&am…

【Linux】Linux 中关于 MySQL 的相关操作

Linux 中关于 MySQL 的相关操作 Linux 系统与 MySQL 数据库是目前互联网开发中最为流行的组合之一。Linux 作为开源的操作系统,具有运行效率高、安全性好等优点;而 MySQL 作为开源的数据库,具有运行速度快、可靠性高等特点。 (1&…

Panda3d 场景管理

Panda3d 场景管理 文章目录 Panda3d 场景管理有关分层场景图的重要信息NodePathNodePath 以及 Node 的函数调用模型文件文件格式加载模型文件将模型放置在场景图中模型缓存压缩模型异步加载模型通过回调函数进行 常见的状态变化修改节点的位置和姿态改变父级节点改变颜色隐藏和…

前端视角中的微信登录

目录 引入 流程介绍 具体实现 引入 本文主要讲解网站应用中微信登录的具体流程是怎么样的,以及作为前端开发人员在这整个流程中的主要任务是什么。 如果想要实现微信登录的功能,需要开发人员到微信开放平台注册相应的账号,进行注册应用&am…

入选《人工智能领域内容榜》

入选《人工智能领域内容榜》第 23名 C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割-CSDN博客

登录注册代码模板(Vue3+SpringBoot)[邮箱发送验证码(HTML)、RSA 加密解密(支持长文本)、黑暗与亮色主题切换、AOP信息校验]

文章归档:https://www.yuque.com/u27599042/coding_star/cx5ptule64utcr9e 仓库地址 https://gitee.com/tongchaowei/login-register-template 网页效果展示 相关说明 在该代码模板中,实现了如下功能: 邮箱发送验证码(邮件内容…

视频批量剪辑:视频合并技巧全攻略,成为视频剪辑专家

在视频制作的过程中,我们常常会遇到需要将多个视频片段合并的需求。这不仅涉及到视频的排列和组合,还需要考虑过渡效果、音频同步等因素。在视频制作过程中,视频批量剪辑是一个非常关键的环节。它可以大大提高工作效率,减少重复劳…

使用 HTTP Client 轻松进行 API 测试

在开发过程中,我们经常需要测试 API 接口以确保其正常工作。JetBrains 的集成开发环境(IDE)如 CLion、IntelliJ IDEA、PyCharm 等,默认内置了 HTTP Client 插件,可以方便地进行API测试。本文将介绍如何使用HTTP Client…

css实现div倾斜效果

效果如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head> <style> *{margin:0;padding: 0;} .box1{margin:30px 100px;width:100px;height:200px;background:blueviolet;} …

十分钟了解自动化测试

自动化测试 自动化测试的定义&#xff1a;使用一种自动化测试工具来验证各种软件测试的需求&#xff0c;它包括测试活动的管理与实施、测试脚本的开发与执行。 自动化测试只是测试工作的一部分&#xff0c;是对手工测试的一种补充; 自动化测试绝不能代替手工测试;多数情况下&…

计算机中怎么依据字节数组找到对应的字符

问题引入 将中文字符“你”用UTF-8编码转成字节数组后&#xff0c;为什么是这样的三个数字&#xff1f; byte[] bytes "你".getBytes(StandardCharsets.UTF_8);for (byte t:bytes){System.out.println(t);} 打印的结果如下&#xff1a; -28 -67 -96 你有没有很好…

网页推理游戏

目录 python challenge &#xff08;0&#xff09; &#xff08;1&#xff09; &#xff08;2&#xff09; The Riddle &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; Nazo &#xff08;1&#xff09;…

玩转ansible之参数调试和文件操作篇

更多IT技术文章&#xff0c;欢迎关注微信公众号“运维之美” 玩转ansible之参数调试和文件操作篇 01 剧本调试和帮助02 使用场景举例 上节我们学习了使用ansible进行软件安装&#xff0c;那么安装完软件后&#xff0c;就需要linux系统和软件配置修改了&#xff0c;对于linux主机…

OSPF综合

实验拓扑 实验需求&#xff1a; 1 R4为ISP&#xff0c;其上只能配置IP地址; R4与其他所有直连设备间均使用公有IP 2 R3-R5/6/7为MGRE环境&#xff0c;R3为中心站点 ; 3 整个OSPF环境IP基于172.16.0.0/16划分; 4 所有设备均可访问R4的环回; 5 减少LSA的更新量&#xff0c;加快收…

数据分析实战 | 逻辑回归——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…

Windows下安装Anaconda5.3.1+Python3.8+TensorFlow2.13.0-CPU版本总结

Python3.8安装可以参考博文https://janus.blog.csdn.net/article/details/55274849 进行安装即可。 【1】Anaconda 清华的开源软件镜像站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载&#xff0c;这里选择的是5.3.1版本。 然后正常安装就可以&am…

悟空crm二次开发 增加客户保护功能 (很久没有消息,但是有觉得有机会的客户)就进入了保护转态

需求&#xff1a;客户信息录入不限数量&#xff0c;但是录入的信息1个月内只有自己和部门领导能看到&#xff0c;如果1个月内未成交或者未转移至自己的客保 则掉入公海所有人可见&#xff0c;这里所说的客保就是现在系统自带的客保 1、需求思维导图 2、新增保护按钮 3、点击该…