0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是堆内存?存储方式是什么样的?

科技绿洲 来源:单片机与嵌入式 作者:单片机与嵌入式 2023-06-22 10:29 次阅读

只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈内存在自动分配空间之后,还会自动释放空间。

什么是堆内存?存储方式是什么样的呢?

首先我们先来介绍一下堆内存在C代码中的存储方式。C代码中动态申请堆内存的申请函数是malloc,常见的内存代码如下图所示:

图片

因为malloc函数返回值是一个内存地址,所以保存堆内存的变量一定得是一个指针,当然这个变量可以是一个单指针,也可以是一个多重指针。

如何获取堆内存?

对于堆内存的获取方法,我们可以有两种方法,第一种是用返回值传递内存指针,第二种方法是通过参数传递给内存指针。上面我们用到的malloc申请内存,就是属于方法一的一种具体表现形式,是直接把返回值传递给内存指针。

方法一:把函数返回值直接赋值给指针,一般表现形式如下:

图片

方法二:将指针地址作为函数返回参数,通过返回参数保存堆内存地址,一般表现形式如下:

图片

总结:这两类方法的本质是一样的,都是函数内存间接申请了内存,但是只有传递内存的方法不一样,方法一是通过返回值传递内存指针,方法二是通过参数传递内存指针。

内存泄漏的三个原因

当我们的代码出现内存泄漏的时候,一般都会包含以下几个原因:
  • 函数内有局部指针变量定义
  • 对该局部指针有获取内存的操作
  • 在函数返回前没有释放该内存,也未保存到其他全局变量或返回上一级函数

如何检查内存泄漏

为了避免检查内存泄漏,我们还是要养成良好的编码习惯。当我们要进行检查内存泄漏问题的时候,一般要做到以下三点:
  • 当我们在函数中看到有局部指针的时候,一定要仔细检查是否有存泄漏的问题发生,养成仔细检查的习惯
  • 如果有局部变量,并且有对局部变量赋值的操作,要检查函数的返回的指针到底是指向什么?是全局变量、静态数据还是堆内存?如果代码中有不熟悉的接口,要找到对应接口文档或源代码分析,保证不要出现不必要的错误
  • 如果函数中有对局部指针有内存申请的操作,那么要检查被保存的是全局变量吗?会被作为函数返回值吗?如果都不是的话,那要排查函数所有的“return”的地方,要保证内存被正确释放,不占用内存
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    12

    文章

    3856

    浏览量

    84661
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72765
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
收藏 人收藏

    评论

    相关推荐

    内存管理(中)

    内存管理(中) 欢迎研究ZigBee的朋友和我交流。。。
    发表于 08-11 19:16

    电脑电源怎么啊,什么样的最好?

    电脑电源怎么啊,什么样的最好?
    发表于 01-15 17:17

    电脑电源怎么啊,什么样的最好?

    电脑电源怎么啊,什么样的最好?
    发表于 01-16 10:34

    内存管理实例中运行Test函数会有什么样的结果

    ); strcpy(str, "helloworld"); printf(str);}运行Test函数会有什么样的结果?答: 程序崩溃;原因:1、实参是通过拷贝的方式 传递给行参
    发表于 01-22 16:15

    面向列的HBase存储结构究竟有什么样的不同之处呢?

    HBase是什么?HBase的存储结构究竟是怎样的呢?面向列的HBase存储结构究竟有什么样的不同之处呢?
    发表于 06-16 06:52

    【原创】内存的那些事

    区域那样有明显的分界线。内存的释放看下面这个图:看到这样频繁的使用区域和释放,那么很容易看出内存是不连续的,跟
    发表于 07-12 09:48

    和栈的区别是什么

    在回答完进程的虚拟地址空间布局之后(上一篇),面试官可能抓住和栈深入展开。和栈的区别①管理方式:栈由编译器自动管理;由程序员控制,使用方便,但易产生
    发表于 12-22 07:26

    Freertos关于内存管理的相关资料分享

    内存管理Malloc、Free防止内存碎片Freertos
    发表于 12-27 08:12

    STM32栈区划分

    STM32栈区(一)一个由C/C++编译的程序占用的内存分为以下几个部分:栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。
    发表于 01-20 08:32

    stm32和栈的相关资料推荐

    关于和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的。那么,在赤裸裸的单片机下的和栈是什么样的分布呢?以下是网摘:刚接手STM32时,你只编写一个int main(){while(1
    发表于 01-25 06:54

    单片机下的和栈是什么样的分布呢?

    是基于os层来聊的。那么,在赤裸裸的单片机下的和栈是什么样的分布呢?以下是网摘:刚接手STM32时,你只编写一个int main(){while(1);}BUILD://Prog...
    发表于 01-25 07:07

    ESP8266上的内存类型有多少?

    arduino 草图时,我使用什么样内存?如果我存储一些非易变的东西但程序在哪里运行,我可以使用 SPIFFS?在公羊?我有多少内存
    发表于 02-24 06:34

    对于VPP硬件不支持的YUV格式转换,采取什么样的软件方式最快?

    对于VPP硬件不支持的YUV格式转换,采取什么样的软件方式最快?
    发表于 09-18 07:54

    5G给内存存储带来了什么样的发展美光科技的解答

     内存存储的区别越来越模糊,在2021年,将看到企业正在寻求新型解决方案,例如存储内存内存虚拟化,以进一步释放AI及激增的数据量带来的
    的头像 发表于 01-17 10:34 2806次阅读

    简述C语言中的内存泄漏的原理及解决方法

    内存泄漏的原理 只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈内存
    的头像 发表于 06-29 14:58 6875次阅读
    简述C语言中的<b class='flag-5'>内存</b>泄漏的原理及解决方法