打印
[开发资料]

C语言中的内存泄漏问题

[复制链接]
368|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2023-9-11 10:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈内存在自动分配空间之后,还会自动释放空间。什么是堆内存?存储方式是什么样的呢?
首先我们先来介绍一下堆内存在C代码中的存储方式。C代码中动态申请堆内存的申请函数是malloc,常见的内存代码如下图所示:
   

因为malloc函数返回值是一个内存地址,所以保存堆内存的变量一定得是一个指针,当然这个变量可以是一个单指针,也可以是一个多重指针。
如何获取堆内存?
    对于堆内存的获取方法,我们可以有两种方法,第一种是用返回值传递内存指针,第二种方法是通过参数传递给内存指针。上面我们用到的malloc申请内存,就是属于方法一的一种具体表现形式,是直接把返回值传递给内存指针。
    方法一:把函数返回值直接赋值给指针,一般表现形式如下:

   


方法二:将指针地址作为函数返回参数,通过返回参数保存堆内存地址,一般表现形式如下:
   
总结:这两类方法的本质是一样的,都是函数内存间接申请了内存,但是只有传递内存的方法不一样,方法一是通过返回值传递内存指针,方法二是通过参数传递内存指针。
当我们的代码出现内存泄漏的时候,一般都会包含以下几个原因:
  • 函数内有局部指针变量定义
  • 对该局部指针有获取内存的操作
  • 在函数返回前没有释放该内存,也未保存到其他全局变量或返回上一级函数

如何检查内存泄漏
    为了避免检查内存泄漏,我们还是要养成良好的编码习惯。当我们要进行检查内存泄漏问题的时候,一般要做到以下三点:
  • 当我们在函数中看到有局部指针的时候,一定要仔细检查是否有存泄漏的问题发生,养成仔细检查的习惯
  • 如果有局部变量,并且有对局部变量赋值的操作,要检查函数的返回的指针到底是指向什么?是全局变量、静态数据还是堆内存?如果代码中有不熟悉的接口,要找到对应接口文档或源代码分析,保证不要出现不必要的错误
  • 如果函数中有对局部指针有内存申请的操作,那么要检查被保存的是全局变量吗?会被作为函数返回值吗?如果都不是的话,那要排查函数所有的“return”的地方,要保证内存被正确释放,不占用内存



使用特权

评论回复
沙发
szt1993| | 2023-9-12 12:45 | 只看该作者
内存泄漏问题确实有时不太容易排查

使用特权

评论回复
板凳
中国龙芯CDX| | 2023-9-18 13:18 | 只看该作者
当我们在函数中看到有局部指针的时候,其实还是访问超出了

使用特权

评论回复
地板
AdaMaYun| | 2023-9-21 19:05 | 只看该作者
当我们的代码出现内存泄漏的时候,一般都会包含以下几个原因:
函数内有局部指针变量定义
对该局部指针有获取内存的操作
在函数返回前没有释放该内存,也未保存到其他全局变量或返回上一级函数
这个是需要重点关注的

使用特权

评论回复
5
小小蚂蚁举千斤| | 2023-9-22 18:17 | 只看该作者
C代码中动态申请堆内存的申请函数是malloc

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

440

主题

1669

帖子

1

粉丝