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

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

3天内不再提示

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

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

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

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

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

图片

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

如何获取堆内存?

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

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

图片

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

图片

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

内存泄漏的三个原因

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

如何检查内存泄漏

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

    关注

    13

    文章

    4292

    浏览量

    85782
  • 内存
    +关注

    关注

    8

    文章

    3016

    浏览量

    73989
  • 函数
    +关注

    关注

    3

    文章

    4326

    浏览量

    62555
收藏 人收藏

    评论

    相关推荐

    堆栈内存内存之间的区别

    编写有效的代码需要了解堆栈和内存,这使其成为学习编程的重要组成部分。不仅如此,新程序员或职场老手都应该完全熟悉堆栈内存内存之间的区别,
    发表于 08-07 12:23 721次阅读
    堆栈<b class='flag-5'>内存</b>和<b class='flag-5'>堆</b><b class='flag-5'>内存</b>之间的区别

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

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

    【原创】内存的那些事

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

    和栈的区别是什么

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

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

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

    ESP8266上的内存类型有多少?

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

    什么样的冰箱没有霜

    什么样的冰箱没有霜 什么样的冰箱比较容易结霜,什么样的冰箱在这方面就会好些?使用中要注意哪些问题呢?   风冷冰箱不易结霜
    发表于 02-21 17:56 2021次阅读

    未来存储技术的发展是什么样

    未来的存储技术会是什么样子呢?对于基于NVMe的传统Flash技术,我们应该继续期望更高的容量。
    发表于 09-18 14:39 1327次阅读

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

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

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

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

    什么是内存内存是如何分配的?

    在一般的编译系统中,内存的分配方向和栈内存是相反的。当栈内存从高地址向低地址增长的时候,内存
    的头像 发表于 07-05 17:58 9965次阅读

    程序内存分区中的与栈

    与栈表示两种内存管理方式; (2)数据结构场景下,与栈表示两种常用的数据结构。 1.程序内存分区中的与栈 1.1 栈简介 栈由操作系统自
    的头像 发表于 11-11 16:21 748次阅读
    程序<b class='flag-5'>内存</b>分区中的<b class='flag-5'>堆</b>与栈

    malloc 申请内存的两种方式

    我们知道malloc() 并不是系统调用,也不是运算符,而是 C 库里的函数,用于动态分配内存。 malloc 申请内存的时候,会有两种方式向操作系统申请
    的头像 发表于 11-13 11:42 2720次阅读
    malloc 申请<b class='flag-5'>内存</b>的两种<b class='flag-5'>方式</b>

    jvm配置内存初始值参数

    JVM(Java Virtual Machine)是Java语言的运行环境,它通过解释字节码并执行相应的指令来运行Java程序。在JVM中,(Heap)是用于存储对象实例的内存区域。而在Java
    的头像 发表于 12-05 14:17 762次阅读

    和栈的区别和使用注意事项

    和栈是在计算机科学中广泛使用的两种数据结构,它们具有不同的用途和特点。和栈的区别涉及到内存分配、访问方式、数据存储等方面。在使用
    的头像 发表于 01-18 17:24 2171次阅读