只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈内存在自动分配空间之后,还会自动释放空间。
什么是堆内存?存储方式是什么样的呢?
首先我们先来介绍一下堆内存在C代码中的存储方式。C代码中动态申请堆内存的申请函数是malloc,常见的内存代码如下图所示:
因为malloc函数返回值是一个内存地址,所以保存堆内存的变量一定得是一个指针,当然这个变量可以是一个单指针,也可以是一个多重指针。
如何获取堆内存?
对于堆内存的获取方法,我们可以有两种方法,第一种是用返回值传递内存指针,第二种方法是通过参数传递给内存指针。上面我们用到的malloc申请内存,就是属于方法一的一种具体表现形式,是直接把返回值传递给内存指针。
方法一:把函数返回值直接赋值给指针,一般表现形式如下:
方法二:将指针地址作为函数返回参数,通过返回参数保存堆内存地址,一般表现形式如下:
总结:这两类方法的本质是一样的,都是函数内存间接申请了内存,但是只有传递内存的方法不一样,方法一是通过返回值传递内存指针,方法二是通过参数传递内存指针。
内存泄漏的三个原因
当我们的代码出现内存泄漏的时候,一般都会包含以下几个原因:
- 函数内有局部指针变量定义
- 对该局部指针有获取内存的操作
- 在函数返回前没有释放该内存,也未保存到其他全局变量或返回上一级函数
如何检查内存泄漏
为了避免检查内存泄漏,我们还是要养成良好的编码习惯。当我们要进行检查内存泄漏问题的时候,一般要做到以下三点:
- 当我们在函数中看到有局部指针的时候,一定要仔细检查是否有存泄漏的问题发生,养成仔细检查的习惯
- 如果有局部变量,并且有对局部变量赋值的操作,要检查函数的返回的指针到底是指向什么?是全局变量、静态数据还是堆内存?如果代码中有不熟悉的接口,要找到对应接口文档或源代码分析,保证不要出现不必要的错误
- 如果函数中有对局部指针有内存申请的操作,那么要检查被保存的是全局变量吗?会被作为函数返回值吗?如果都不是的话,那要排查函数所有的“return”的地方,要保证内存被正确释放,不占用内存
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
存储
+关注
关注
13文章
4292浏览量
85782 -
内存
+关注
关注
8文章
3016浏览量
73989 -
函数
+关注
关注
3文章
4326浏览量
62555
发布评论请先 登录
相关推荐
堆栈内存和堆内存之间的区别
编写有效的代码需要了解堆栈和堆内存,这使其成为学习编程的重要组成部分。不仅如此,新程序员或职场老手都应该完全熟悉堆栈内存和堆内存之间的区别,
发表于 08-07 12:23
•721次阅读
内存管理实例中运行Test函数会有什么样的结果
); strcpy(str, "helloworld"); printf(str);}运行Test函数会有什么样的结果?答: 程序崩溃;原因:1、实参是通过拷贝的方式 传递给行参
发表于 01-22 16:15
堆和栈的区别是什么
在回答完进程的虚拟地址空间布局之后(上一篇),面试官可能抓住堆和栈深入展开。堆和栈的区别①管理方式:栈由编译器自动管理;堆由程序员控制,使用方便,但易产生
发表于 12-22 07:26
单片机下的堆和栈是什么样的分布呢?
是基于os层来聊的。那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘:刚接手STM32时,你只编写一个int main(){while(1);}BUILD://Prog...
发表于 01-25 07:07
ESP8266上的内存类型有多少?
arduino 草图时,我使用什么样的内存?如果我存储一些非易变的东西但程序在哪里运行,我可以使用 SPIFFS?在公羊?我有多少内存?
发表于 02-24 06:34
5G给内存和存储带来了什么样的发展美光科技的解答
内存和存储的区别越来越模糊,在2021年,将看到企业正在寻求新型解决方案,例如存储级内存和内存虚拟化,以进一步释放AI及激增的数据量带来的
jvm配置堆内存初始值参数
JVM(Java Virtual Machine)是Java语言的运行环境,它通过解释字节码并执行相应的指令来运行Java程序。在JVM中,堆(Heap)是用于存储对象实例的内存区域。而在Java
堆和栈的区别和使用注意事项
堆和栈是在计算机科学中广泛使用的两种数据结构,它们具有不同的用途和特点。堆和栈的区别涉及到内存分配、访问方式、数据存储等方面。在使用
评论