只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈内存在自动分配空间之后,还会自动释放空间。
什么是堆内存?存储方式是什么样的呢?
首先我们先来介绍一下堆内存在c代码中的存储方式。c代码中动态申请堆内存的申请函数是malloc,常见的内存代码如下图所示:
因为malloc函数返回值是一个内存地址,所以保存堆内存的变量一定得是一个指针,当然这个变量可以是一个单指针,也可以是一个多重指针。
如何获取堆内存?
对于堆内存的获取方法,我们可以有两种方法,第一种是用返回值传递内存指针,第二种方法是通过参数传递给内存指针。
上面我们用到的malloc申请内存,就是属于方法一的一种具体表现形式,是直接把返回值传递给内存指针。
方法一:把函数返回值直接赋值给指针,一般表现形式如下:
方法二:将指针地址作为函数返回参数,通过返回参数保存堆内存地址,一般表现形式如下:
总结:这两类方法的本质是一样的,都是函数内存间接申请了内存,但是只有传递内存的方法不一样,方法一是通过返回值传递内存指针,方法二是通过参数传递内存指针。
内存泄漏的三个原因
当我们的代码出现内存泄漏的时候,一般都会包含以下几个原因:
函数内有局部指针变量定义
对该局部指针有获取内存的操作
在函数返回前没有释放该内存,也未保存到其他全局变量或返回上一级函数
如何检查内存泄漏
为了避免检查内存泄漏,我们还是要养成良好的编码习惯。当我们要进行检查内存泄漏问题的时候,一般要做到以下三点:
当我们在函数中看到有局部指针的时候,一定要仔细检查是否有存泄漏的问题发生,养成仔细检查的习惯
如果有局部变量,并且有对局部变量赋值的操作,要检查函数的返回的指针到底是指向什么?是全局变量、静态数据还是堆内存?如果代码中有不熟悉的接口,要找到对应接口文档或源代码分析,保证不要出现不必要的错误
如果函数中有对局部指针有内存申请的操作,那么要检查被保存的是全局变量吗?会被作为函数返回值吗?如果都不是的话,那要排查函数所有的“return”的地方,要保证内存被正确释放,不占用内存。
通过简单的保存-恢复策略避免UVM VIP的冗余仿真周期
浅谈产品电磁兼容性设计培训的重要性
旧手机别丢了!参与vivo以旧换新活动, 最高可享2020元补贴
如何用两种不同的方法列写双容水槽传递函数
电路板设计可测试性技术
怎么解决C语言中的内存泄漏问题呢?
基于对数放大器进行RF脉冲检测的作用分析
面向数组计算任务而设计的Numba具有CUDA加速功能
智能制造技术会是提高生产的利器吗
一种运用太阳能电池板技术的新OLED架构
PCB布线:50欧姆迹线宽度应该有多宽?
iQOO手机评测 “武林英雄”生而强悍
麒麟芯片量产计划将搁浅 鸿蒙系统或许是救星
长电科技推出XDFOI全系列产品 为全球客户提供更加优质的服务
机器人教育的作用
3D打印机把制造PCB变得越来越简单
中兴研发首款屏下摄像头手机AXON 20 5G,难度巨大
TWS耳机的光辉岁月
如何制作WiFi控制的汽车以及为其编写应用程序
光电耦合器的基本特性