C语言中malloc函数产生的内存泄漏问题

 

一、malloc函数

        使用malloc函数要注意:如果所申请的内存块大于目前堆上剩余的内存块(整块),则内存分配就会失败,函数返回值为NULL。注意这里说的是“堆上剩余内存块”不是所有剩余内存块之和,因为malloc函数申请的是连续的一块内存。malloc函数申请内存有不成功的可能,那我们在使用指向这块内存的指针时,必须用if( p!=NULL )语句上来验证内存分配是否成功。

例子:

        char *p=(char *)malloc(100);

       假如在堆内存分配了100个字节的内存,返回这块内存的首地址,把地址强制转换成char *类型后赋给char *类型的指 针变量p;同时告诉我们这块内存将用来存储char类型的数据。只能通过指针变量p来操作这块内存,这块内存本身没有名字,对它的访问是匿名访问。但是,不一定每次malloc函数都能成功分配到内存。

 

二、free函数

        自动变量使用的内存数量在程序执行期间自动增加或减少。但是动态分配的内存数量只会增加,除非使用free函数进行释放。

        free函数其实它就做了一件事:释放该内存的使用权,也就是断开指针变量和这块内存的对应关系。free函数就是把这块内存和p 之间的映射关系断开;指针变量p本身保存的地址并没有改变;关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者被修改为其他值,这就是free函数的功能。

 

三、内存泄漏

1、定义

       内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

2、堆内存泄漏

        malloc申请的是堆内存,对于malloc内存泄露,只要遵循:”谁申请谁释放,在同一函数中申请在同一函数中释放”原则基本上可以杜绝内存泄露问题。当然,在很多情况下,不可避免地需要在不同的函数中申请和释放,甚至需要在不同的任务中申请和释放。这才是造成堆内存泄露的主要原因。

3、解决办法:

       申请完后,需要free函数释放内存。一个malloc对应一个free。在使用free(p) 函数内存释放后,指针变量p本身保存的地址并没有改变那我们必须需重新把p的值变为NULL:p = NULL。如 果没有把该指针置NULL,这个指针就成为了“悬空指针”,也就是野指针,这也是经常出错的地方。 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值