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

    文章

    4298

    浏览量

    62348
  • 代码
    +关注

    关注

    30

    文章

    4732

    浏览量

    68273
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14271

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

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

收藏 人收藏

    评论

    相关推荐

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 221次阅读

    c语言中从左到右结合怎么看

    C语言中,操作符的结合性(Associativity)是指当操作符在表达式中连续出现时,它们如何与操作数结合的顺序。对于大多数二元操作符(即需要两个操作数的操作符),C语言遵循两种基
    的头像 发表于 08-20 11:42 668次阅读

    如何检测内存泄漏

    检测内存泄漏是软件开发过程中一项至关重要的任务,它有助于识别和解决那些导致程序占用过多内存资源,从而影响程序性能甚至导致程序崩溃的问题。以下将详细阐述几种常见的内存
    的头像 发表于 07-30 11:50 1391次阅读

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈
    发表于 03-19 11:38 462次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题原理

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是一种低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级语言中的异常处理机制,例如try-catch-finally
    的头像 发表于 02-28 14:25 581次阅读

    C语言中的动态内存管理讲解

    本章将讲解 C 中的动态内存管理。C 语言内存的分配和管理提供了几个函数。这些函数可以在 头文件中找到。
    的头像 发表于 02-23 14:03 362次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的动态<b class='flag-5'>内存</b>管理讲解

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    一些措施来解决和防止其发生。本文将详细介绍C语言中访问权限冲突异常的原因以及解决方法。 一、访问权限冲突异常的原因分析 访问权限冲突异常可分为两类:访问私有成员和访问未定义成员。下面分别分析这两种异常的原因。 1. 访问
    的头像 发表于 01-12 16:03 4853次阅读

    C语言中结构体能不能相加

    C语言中,结构体能不能相加?
    的头像 发表于 12-19 17:04 1196次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>结构体能不能相加

    c语言中逻辑真等价于什么

    C语言中,逻辑真等价于1。逻辑真可以理解为一个表达式、语句或条件的结果为真,即满足条件。在计算机科学和编程中,逻辑真在控制流语句、循环和条件语句中具有重要的作用。 逻辑真等价于条件为真的情况。在C
    的头像 发表于 11-30 14:10 1957次阅读

    c语言中decimal的含义

    C语言中的“decimal”是一种数据类型,用于表示十进制数字。在C语言中,常用的数据类型有整数类型(int)、浮点类型(float和double)、字符类型(char)等,而deci
    的头像 发表于 11-30 10:57 2245次阅读

    c语言中数组怎么定义

    C语言中,数组是一种用来存储相同类型元素的数据结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据结构,可以用于解决很多实际的问题。 在C语言中,定义数
    的头像 发表于 11-24 10:11 2842次阅读

    \0在c语言中怎么用

    是由贝尔实验室的Dennis Ritchie为了开发UNIX操作系统而设计的。它在20世纪70年代初首次出现,并迅速流行起来。C语言以其简洁、高效、低级别的特性成为了广泛使用的编程语言。 二、基本语法 注释 在
    的头像 发表于 11-24 09:59 2983次阅读

    scanf在C语言中的作用

    scanf在C语言中的作用  scanf是C语言中的输入函数,用于从标准输入设备(如键盘)读取数据,并将其存储到变量中。它是C
    的头像 发表于 11-23 14:13 1279次阅读

    c语言中顺序结构的基本流程

    的语句组成,这些语句用于完成特定的任务或操作。在C语言中,每个语句都以分号结束,多个语句可以用大括号括起来形成一个语句块。在顺序结构中,每个语句都依次执行,按照代码的顺序执行,然后才会执行下一条语句。 首先,我们
    的头像 发表于 11-22 10:20 917次阅读

    C语言中如何实现注释

    C语言中,注释是用来增加代码可读性和注释过程和功能的文本。C语言中支持两种类型的注释:单行注释和多行注释。 单行注释以双斜杠(//)开始,直到该行结束。该注释语句可以在代码的任何位置
    的头像 发表于 11-22 10:17 1208次阅读