当前位置: 首页 > 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.lryc.cn/news/439705.html

相关文章:

  • C/C++实现植物大战僵尸(PVZ)(打地鼠版)
  • C++ 科目二 智能指针 [weak_ptr] (解决shared_ptr的循环引用问题)
  • 解决RabbitMQ设置TTL过期后不进入死信队列
  • 【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
  • EndnoteX9安装及使用教程
  • SQL:子查询
  • C语言刷题日记(附详解)(5)
  • 开源加密软件简介
  • 【C++学习】 IO 流揭秘:高效数据读写的最佳实践
  • C#使用TCP-S7协议读写西门子PLC(五)-测试程序
  • 经验——IMX6UL的uboot无法ping主机或Ubuntu
  • AUTOSAR-规范文档版本
  • 网络(四)——HTTP协议
  • comfyui中报错 Cmd(‘git‘) failed due to: exit code(128) 如何解决
  • 测试-Gatling 与性能测试
  • ESRGAN——老旧照片、视频帧的修复和增强,提高图像的分辨率
  • 跨界融合:EasyDSS+无人机视频直播推流技术助力行业多场景应用
  • Linux实操笔记2 Ubuntu安装Nginx的不同方法
  • QCustomPlot笔记(一)
  • 【机器学习】多模态AI——融合多种数据源的智能系统
  • QT学习与数据库连接
  • 泛读笔记:从Word2Vec到BERT
  • redis实现分布式锁详细教程,可续锁(看门狗)、可重入
  • 代码随想录打卡Day32
  • 数学学习记录
  • R语言统计分析——散点图1(常规图)
  • 蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
  • 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
  • Linux - iptables防火墙
  • 【C语言零基础入门篇 - 3】:格式化输入输出、字符操作和sizeof运算符揭秘