找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2957|回复: 0
打印 上一主题 下一主题
收起左侧

c语言的内存泄漏问题

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-2-21 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先从一个函数来分析内存泄漏的原因:
char *doSomething()
{
     char *p;
     char *q;
     if( ( p=malloc( 1024 )  ) ==NULL ) returnNULL;
     if( ( q=malloc(2000 )  ) ==NULL ) return NULL;
    .......
     returnp;
}
分析一下这个函数,我们会发现开发人员考虑了p和q内存分配失败的问题,但是却考虑不周,加入,p内存分配成功,而q内存分配失败,那么returnNULL后,p指向的1024个单元的内存就丢失了,造成了内存泄漏。
      造成内存泄漏的原因一般有以下几种原因:
1、开发人员动态申请内存后,忘记了释放内存
2、多个开发人员在合作开发的过程中,由于沟通不足,没有明确的规定由谁来申请内存,有谁来释放内存
3、free()函数是根据malloc()申请的内存控制信息来释放内存的,换句话说,free只能释放由malloc函数返回的内存指针,而在这期间,如果malloc分配的内存,其指针发生了变化,free函数将不能释放该内存,从而造成内存泄漏。关于这一点可以举个例子:
void doSomething( char *ptr )
{
        char *p;
        int i;
         if( ptr == NULL )  return; // 入口参数合法性检查
         if(( p= (char *) malloc ( 1024 ) ) ==NULL ) return; //分配空间并检查
        for( i=0; i< 1024; i++ )
        {
                  *p++ = *ptr++;
        }
        ......
        free( p );
         return;
}
这个函数考虑了动态申请内存,以及释放内存,但是忽略了一点,就是在释放前p的值已经发生了改变,所以free(p)函数执行失败。因此仍然会造成内存泄漏。要应对这种问题,就是要保存p指针,例如可以采用如下方式:
* ( p+i) = *(ptr+i)   ;       或者 *( p + i)= *ptr++;
这样就回避了以上问题。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表