编程语言应用

首页 » 常识 » 诊断 » 详解在C语言编程中内存泄漏现象
TUhjnbcbe - 2022/10/24 14:12:00

内存泄漏问题

在C语言编程的时候几乎这个问题很难去避免他,不管你是刚进入C语言开发的小白还是久经沙场的老鸟,在面对内存泄漏这一块上如果不细心就会遇到,甚至我们所熟悉的Windows和开发用的比较多的Linux都或多或少的存在内存的泄露问题。

记得在初学C语言的时候有同学提出是不是只要内存够大就不怕他泄漏,额这个问题按理论上来说是这样的,但是你作为一个开发人员,很多时候不能这样去想问题,在一些比较特殊的领域对内存泄露问题是不能容忍的,给你举个例子在嵌入式系统开发中当你开发的是一个心脏起搏器这类产品时模拟试想一下,随着内存泄漏,最后导致起搏器停止,那后果课时不堪设想的,所以总的来说就是想告诉你,内存泄漏是一个很大很大的危险。

泄漏的本质

在之前有发过一篇关于系统编程的内存分布与管理,看过的可能对内存的结构有比较良好的理解,在这里我们来看一下内存泄漏它漏的到底是哪部分内存;

会产生内存泄漏就是我们的堆内存,我们回想一下我们的堆内存是如何使用的,首先堆内存的使用是由我们程序员自己手动用malloc()或者是new函数去申请的,使用结束后呢用函数free()或者delecte去释放,他自己本身不会被释放(程序结束了它也会释放)但是有一些程序一运行就几年或者是十几年的服务器程序内存泄露就会越来越多,最后到最后服务器系统瘫痪。

通俗一点来说就是:你申请完堆地址空间后,使用完之后并没有及时把它释放。

图片描述(最多18字)

内存泄漏对策

1、在使用malloc()函数的时候你要记住以下几点:内存分配给谁?分配多大的内存空间?申请的内存地址是什么类型?

在这里提一下malloc()函数一个有趣的问题,在前面也留过这样的一个问题:如果你用malloc函数去申请一个大小为0的空间会发生什么事?

根据技术文档以及malloc函数说明,官方给的说明说是会返回NULL或者一个地址,其实问题就在这个“或者”,我自己经过在Linux上gcc编译器去申请一个大小为0的地址,发现并没有报错,也不会返回NULL后来我试着给返回的地址进行操作,发现返回来的指针地址是可以正常使用的。对于这一问题我觉得应该有其他不同的见解,希望各位专家动手尝试一下。

2、要避免内存泄漏那就是不用的堆地址你就给人家释放掉,释放函数free(),在括号里面放上不用的指针地址就好了(例如free(P)释放p指针所指向的地址空间)。申请的次数和释放的次数一致就不会造成内存泄漏,就是说一个malloc()配给它一个free()。

在这里留给大家一个问题:对于一个指向NULL的指针多次free()对发生情况,为什么会发生这样的结果?

1
查看完整版本: 详解在C语言编程中内存泄漏现象