C语言中的内存泄漏如何解决?
ARM与嵌入式 2024-05-24
只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈内存在自动分配空间之后,还会自动释放空间。什么是堆内存?存储方式是什么样的呢?

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

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

当我们的代码出现内存泄漏的时候,一般都会包含以下几个原因:

  • 函数内有局部指针变量定义

  • 对该局部指针有获取内存的操作

  • 在函数返回前没有释放该内存,也未保存到其他全局变量或返回上一级函数

如何检查内存泄漏
为了避免检查内存泄漏,我们还是要养成良好的编码习惯。当我们要进行检查内存泄漏问题的时候,一般要做到以下三点:
  • 当我们在函数中看到有局部指针的时候,一定要仔细检查是否有存泄漏的问题发生,养成仔细检查的习惯

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

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


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • C 语言中数据类型的解释

    在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间。

    06-14
  • 编程七大数据结构的奥秘

    在编程的世界里,数据结构是构建信息框架的骨架。就像现实生活中的建筑需要精心设计的结构一样,我们的数据也需要合适的结构来保证程序的高效和稳定。

    06-14
  • C 程序中可用的4个存储类

    存储类定义C语言程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。

    06-14
  • 程序内存分区中的堆与栈

    堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不

    06-14
  • 驱动系统的定义:解析动力传输的核心概念

    驱动程序本质上是软件代码,主要作用是计算机系统与硬件设备之间完成数据传送的功能,只有借助驱动程序,两者才能通信并完成特定的功能。如果一个硬件设备没有驱动程序,只有操作系统是不能发挥特有功能的,也就是...

    06-13
  • 驱动系统的定义及其在自动化领域的应用

    驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能...

    06-13
  • 操作系统的安全性和功能如何提高系统性能?

    计算的操作系统对于计算机可以说是十分重要的,从使用者角度来说,操作系统可以对计算机系统的各项资源板块开展调度工作,其中包括软硬件设备、数据信息等,运用计算机操作系统可以减少人工资源分配的工作强度,使...

    06-13
  • 计算机体系结构的优化方法有哪些?

    计算机操作系统诞生初期,其体系结构就属于简单体系结构,由于当时各式各样影响因素的作用,如硬件性能、平台、软件水平等方面的限制,使得当时的计算机操作系统结构呈现出一种混乱且结构模糊的状态,其操作系统的...

    06-13
  • 线程概述如何影响程序性能?

    线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题?对于...

    06-13
  • MCU原理及区别:实用技巧与建议

    1.对密集的乘法运算的支持GPP不是设计来做密集乘法任务的,即使是一些现代的GPP,也要求多个指令周期来做一次乘法。而DSP处理器使用专门的硬件来实现单周期乘 法。DSP处理器还增加了累加器寄存器来处理多个乘积的和...

    06-13
  • C++锁机详解:应用场景与实用代码一网打尽

    一、互斥锁(Mutex)1. std::mutex含义: std::mutex 最基本的互斥锁,当一个线程占用

    06-13
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告