只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈内存在自动分配空间之后,还会自动释放空间。
什么是堆内存?存储方式是什么样的呢?
首先我们先来介绍一下堆内存在c代码中的存储方式。c代码中动态申请堆内存的申请函数是malloc,常见的内存代码如下图所示:
因为malloc函数返回值是一个内存地址,所以保存堆内存的变量一定得是一个指针,当然这个变量可以是一个单指针,也可以是一个多重指针。如何获取堆内存?
对于堆内存的获取方法,我们可以有两种方法,第一种是用返回值传递内存指针,第二种方法是通过参数传递给内存指针。上面我们用到的malloc申请内存,就是属于方法一的一种具体表现形式,是直接把返回值传递给内存指针。方法一:把函数返回值直接赋值给指针,一般表现形式如下:
方法二:将指针地址作为函数返回参数,通过返回参数保存堆内存地址,一般表现形式如下:
总结:这两类方法的本质是一样的,都是函数内存间接申请了内存,但是只有传递内存的方法不一样,方法一是通过返回值传递内存指针,方法二是通过参数传递内存指针。内存泄漏的三个原因
当我们的代码出现内存泄漏的时候,一般都会包含以下几个原因:函数内有局部指针变量定义对该局部指针有获取内存的操作在函数返回前没有释放该内存,也未保存到其他全局变量或返回上一级函数如何检查内存泄漏
为了避免检查内存泄漏,我们还是要养成良好的编码习惯。当我们要进行检查内存泄漏问题的时候,一般要做到以下三点:当我们在函数中看到有局部指针的时候,一定要仔细检查是否有存泄漏的问题发生,养成仔细检查的习惯如果有局部变量,并且有对局部变量赋值的操作,要检查函数的返回的指针到底是指向什么?是全局变量、静态数据还是堆内存?如果代码中有不熟悉的接口,要找到对应接口文档或源代码分析,保证不要出现不必要的错误如果函数中有对局部指针有内存申请的操作,那么要检查被保存的是全局变量吗?会被作为函数返回值吗?如果都不是的话,那要排查函数所有的“return”的地方,要保证内存被正确释放,不占用内存
安科瑞公司ABAT系列蓄电池在线监测系统
一种新型的基于仿真的MEMS结构进化方法
三星推出了Galaxy Buds Pro全无线耳机
三星 Galaxy S8 金色版相片曝光, 配合日落桌布推出
编码器分辨率对绝对值的要求是什么越高越好
什么是堆内存?存储方式是什么样的?
映众RTX2060黑金至尊版评测 真正的甜点性价比意外惊喜
向强电冲击的先锋----可控硅
强大的蔚来EP9,从里到外深度解析!
奥拓电子相关MiniLED显示产品已可以批量生产 未来将在LED高密度领域会持续保持竞争优势
学习践行“两会”精神,十年磨一剑,聚势共飞腾
戴森计划斥资36亿美元投资AI、机器人等新技术
信号完整性SI读书笔记
今日看点丨韩国超导低温学会:LK-99没有表现出迈斯纳效应;即时生效!印度限制进口部分电脑和服务器
2027年我国人工智能服务器市场规模将达134亿美元
国美集团与TCL集团达成了2019年合作战略将引领智能化家居生活新方式
4000A系列高分辨率USB示波器的特点优势及应用范围
凛冬将至!足不出户,在家就可探索君临城取景地点
正确合理的安装服务器操作系统
基于厨房定时器的设计应用过程