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

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

3天内不再提示

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

Q4MP_gh_c472c21 来源:金橙智能 作者:金橙智能 2021-06-29 14:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

内存泄漏的原理

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

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

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

d6d6bf80-d8a6-11eb-9e57-12bb97331649.png

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

如何获取堆内存?

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

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

d6e7fce6-d8a6-11eb-9e57-12bb97331649.png

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

d6f30ea6-d8a6-11eb-9e57-12bb97331649.png

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

内存泄漏的三个原因

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

如何检查内存泄漏

为了避免检查内存泄漏,我们还是要养成良好的编码习惯。当我们要进行检查内存泄漏问题的时候,一般要做到以下三点:

(1)当我们在函数中看到有局部指针的时候,一定要仔细检查是否有存泄漏的问题发生,养成仔细检查的习惯;

(2)如果有局部变量,并且有对局部变量赋值的操作,要检查函数的返回的指针到底是指向什么?是全局变量、静态数据还是堆内存?如果代码中有不熟悉的接口,要找到对应接口文档或源代码分析,保证不要出现不必要的错误;

(3)如果函数中有对局部指针有内存申请的操作,那么要检查被保存的是全局变量吗?会被作为函数返回值吗?如果都不是的话,那要排查函数所有的“return”的地方,要保证内存被正确释放,不占用内存。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66812
  • 代码
    +关注

    关注

    30

    文章

    4940

    浏览量

    73116
  • C代码
    +关注

    关注

    1

    文章

    90

    浏览量

    15085

原文标题:一篇文章帮你解决C语言中的内存泄漏问题

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达式) { 执行代码块; } 其语义是:如果表达式的值为真,则执行其后的语句,否则不执
    发表于 11-25 07:48

    C语言的常量介绍

    、-13; 实型常量:13.33、-24.4; 字符常量:‘a’、‘M’ 字符串常量:”I love china!” 在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先
    发表于 11-24 07:12

    at_device 包 ml307长时间运行有内存泄漏问题怎么解决?

    使用 at_device 包中的 ml307 包长时间运行有大量内存泄漏问题,大概涨了20K,求助解决。
    发表于 09-24 07:41

    灵活高效双引擎驱动:ZBUFF让C语言内存操作更智能!

    高性能系统。 一、ZBUFF核心库常用函数 如果小伙伴们此前没有接触过C语言或者不精通C语言,把ZBUFF核心库当成新库来学习即可,建议先从熟悉相关函数的功能及其参数意义入手。 感兴趣
    的头像 发表于 08-11 13:27 432次阅读
    灵活高效双引擎驱动:ZBUFF让<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>操作更智能!

    Windows环境下32位汇编语言中文资料

    电子发烧友网站提供《Windows环境下32位汇编语言中文资料.rar》资料免费下载
    发表于 06-30 15:14 0次下载

    在OpenVINO™ C++代码中启用 AddressSanitizer 时的内存泄漏怎么解决?

    在 OpenVINO™ C++代码中启用 AddressSanitizer 时遇到内存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    发表于 06-23 07:16

    深入理解C语言C语言循环控制

    改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种
    的头像 发表于 04-29 18:49 1728次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    C语言中结构体与联合体的深度解析:内存布局与应用场景

    一、基础概念与核心差异 1.1 结构体(Struct)的本质 **结构体是C语言中实现数据封装的基石,其核心特征在于内存独立性。每个成员变量在内存中按声明顺序依次排列,形成连续的
    发表于 04-08 09:18

    快速搞懂C语言程序内存分区!

    到动态分配的数据等内容。(内存分区图示)理解这些内存分区的结构和特性,不仅有助于编写更高效的代码,还能帮助排查和解决如段错误、内存泄漏、栈溢出等常见问题。以下是常见的六
    的头像 发表于 03-14 17:37 1327次阅读
    快速搞懂<b class='flag-5'>C</b><b class='flag-5'>语言</b>程序<b class='flag-5'>内存</b>分区!

    内存泄漏检测工具Sanitizer介绍

    内存泄漏,我们经常会遇到,如何检测内存泄漏,除了我们之前讲过的 valgrind,还可以使用 gcc 自带的工具 sanitizer。
    的头像 发表于 03-01 14:52 1435次阅读

    分析C语言代码结构的设计问题

    来分析一个C语言代码结构的设计问题。 这段代码,使用了两次malloc,分别给 p1 和 p2 申请了内存。用完后,内存释放,防止内存
    的头像 发表于 02-11 09:31 658次阅读

    无功补偿故障原因及解决方法

    无功补偿故障可能由多种原因引起,以下是一些常见的故障原因及其解决方法
    的头像 发表于 01-29 14:25 2615次阅读

    电子焊接的常见问题及解决方法

    电子焊接是电子组装过程中的关键步骤,焊接质量的好坏直接影响电子产品的性能和可靠性。在电子焊接过程中,经常会遇到一些常见问题,掌握其解决方法对于提高焊接质量具有重要意义。以下是几种常见的电子焊接
    的头像 发表于 01-09 10:28 1901次阅读

    EE-62:在C语言中访问短字内存

    电子发烧友网站提供《EE-62:在C语言中访问短字内存.pdf》资料免费下载
    发表于 01-07 14:02 0次下载
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>语言中</b>访问短字<b class='flag-5'>内存</b>

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言中</b>的DSP:从<b class='flag-5'>C</b>调用汇编类成员函数