久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2956|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人精品 | 久久久无码精品亚洲日韩按摩 | 国产成人a亚洲精品 | 国产精品久久久久久久午夜片 | 久久国产精品色av免费观看 | 国产一区二区三区视频 | 成人亚洲精品久久久久软件 | 超碰成人免费 | www.国产精品 | 精品自拍视频在线观看 | 亚洲一区二区三区 | 欧美一区在线视频 | 麻豆精品一区二区三区在线观看 | 97精品国产97久久久久久免费 | 亚洲成人一区二区三区 | 国内精品视频在线观看 | 日韩一区二区精品 | 亚洲欧美一区二区三区国产精品 | 久久久91精品国产一区二区三区 | 中文字幕国产精品 | 精品日韩一区 | 天天影视综合 | 欧美一区二区三区在线播放 | 一区二区三区在线 | 日本黄色一级视频 | 一级毛片色一级 | 国产中文| 99热精品在线 | 婷婷激情综合 | 午夜一区二区三区在线观看 | 欧美在线天堂 | 美女亚洲一区 | 日日夜夜视频 | 成人av播放 | 亚洲一二三区av | 国产精品成人在线 | 一区二区三区视频在线观看 | 日韩视频中文字幕 | 免费a大片 | 欧美成人第一页 | 91高清在线观看 |