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

动态内存

动态内存分配函数:在程序运行时为变量或数据结构开辟的内存空间的函数。

有三个重要的动态分配函数:malloc、calloc、realloc。

 动态内存分配函数

malloc 

这个函数是向内存中申请一块连续的空间,返回一个指向这个块空间的指针。

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。
  • 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。 

举一个例子:

 malloc函数只是拿一块连续的空间,也不进行初始化,而且使用完后需要还给内存,这时就需要一个函数:

free

free函数用来释放动态开辟的内存。 

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做。 

所以使用动态内存分配函数前需要判断指针是否为空 ,然后在free函数进行释放,最后再置为空指针(不置为空的话,会成为野指针,当调用这个地址时数据也会被使用)。

 

calloc

 calloc函数和malloc函数差不多,唯一不同的就是,calloc开辟的一块空间都置为0

realloc 

这个函数比前两个函数的开辟更加灵活。

  •  ptr 是要调整的内存地址
  • size 调整之后整块空间的大小
  • 返回值为调整之后的内存起始位置。

分两种情况: 

1)在一块空间中,假设ptr开辟的空间后还足够开辟扩大的空间,那就可以直接完后开辟,返回的也是原来的地址。

2)假设后面的空间不够开辟扩大的空间,那么就需要开辟一块足够存放整块空间的大小的新的空间,然后将原先开辟的数据拷贝过去且原先的空间被释放,返回的是一个新的地址。

常见的动态错误

对NULL指针解引用

 在使用动态内存分配函数,不进行指针为空的判断,就解引用赋值程序会警告。

对动态开辟空间的越界访问

 假设开辟了一块空间,但是访问时却超过了这块空间,这就是越界访问程序会崩溃的。

对非动态开辟内存使用free释放

 free函数只能对动态开辟(堆区)的空间进行释放,但是如果不是堆区而是栈区那么程序会崩。

使用free释放一块动态开辟内存的一部分

 free返回的是开辟动态区的起始位置,但是下图在赋值时p的位置就改变了系统就崩了。

对同一块动态内存多次释放

可能在程序中会出现不记得是否写过free函数,所以就会出现这个问题多次释放,这个程序也是会崩的。出现这个问题,可以在每一次的free函数下把指针置为NULL,这样就不会出现问题啦。

动态开辟内存忘记释放(内存泄漏)

大概意思就是开辟空间后没有释放,这个可以是很多种情况:可能是忘记了;又或者是程序运行时不执行free语句在free之前就结束程序;又或者是调用函数是没有释放等等……。

所以开辟了动态内存就一定需要释放。


http://www.mrgr.cn/news/28344.html

相关文章:

  • 【eNSP】路由基础与路由来源——静态路由实验
  • Scala的Array(1)
  • ReactPress与WordPress:一场内容管理系统的较量
  • LabVIEW开发相机与显微镜自动对焦功能
  • 【Visual Studio】设置文件目录
  • python作图设置坐标轴刻度为科学计数法
  • 实用类工具!分享6款AI论文一键生成器免费8000字
  • java技术栈介绍
  • 斗破C++编程入门系列之二十八:继承与派生:概念介绍与派生类的声明(一星斗师)
  • 基于Sobel算法的边缘检测设计与实现(一张图绝杀必懂)
  • Y电容(安规电容)的作用是什么?
  • 如何快速整理生成python项目依赖的库,提升自动化部署效率
  • SpringBoot中使用EasyExcel并行导出多个excel文件并压缩zip后下载
  • Gradio 中如何让 Chatbot 自动滚动
  • 来重庆工作2年,想念广东了
  • AI替代插画师跟设计师?不用焦虑!
  • MOE论文汇总
  • 【最新华为OD机试E卷-支持在线评测】最长连续子序列(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 公路数据集、桥梁数据集、隧道数据集、地铁数据集、水坝数据集、挡土墙数据集
  • 达芬奇竖屏导出有黑屏解决方案
  • cad2015以上默认设置
  • JAVA算法数据结构第一节稀疏矩阵
  • Python数据分析-世界上最富有的1000人
  • re题(21)BUUCTF—findit
  • 除了C# 、C++,C++ cli 、还有一个Java版的 db
  • 面试官问:请描述一次你成功解决问题的经历?