標(biāo)題: c語言的內(nèi)存泄漏問題 [打印本頁]

作者: 51黑黑黑    時(shí)間: 2016-2-21 15:40
標(biāo)題: c語言的內(nèi)存泄漏問題
我們先從一個(gè)函數(shù)來分析內(nèi)存泄漏的原因:
char *doSomething()
{
     char *p;
     char *q;
     if( ( p=malloc( 1024 )  ) ==NULL ) returnNULL;
     if( ( q=malloc(2000 )  ) ==NULL ) return NULL;
    .......
     returnp;
}
分析一下這個(gè)函數(shù),我們會發(fā)現(xiàn)開發(fā)人員考慮了p和q內(nèi)存分配失敗的問題,但是卻考慮不周,加入,p內(nèi)存分配成功,而q內(nèi)存分配失敗,那么returnNULL后,p指向的1024個(gè)單元的內(nèi)存就丟失了,造成了內(nèi)存泄漏。
      造成內(nèi)存泄漏的原因一般有以下幾種原因:
1、開發(fā)人員動態(tài)申請內(nèi)存后,忘記了釋放內(nèi)存
2、多個(gè)開發(fā)人員在合作開發(fā)的過程中,由于溝通不足,沒有明確的規(guī)定由誰來申請內(nèi)存,有誰來釋放內(nèi)存
3、free()函數(shù)是根據(jù)malloc()申請的內(nèi)存控制信息來釋放內(nèi)存的,換句話說,free只能釋放由malloc函數(shù)返回的內(nèi)存指針,而在這期間,如果malloc分配的內(nèi)存,其指針發(fā)生了變化,free函數(shù)將不能釋放該內(nèi)存,從而造成內(nèi)存泄漏。關(guān)于這一點(diǎn)可以舉個(gè)例子:
void doSomething( char *ptr )
{
        char *p;
        int i;
         if( ptr == NULL )  return; // 入口參數(shù)合法性檢查
         if(( p= (char *) malloc ( 1024 ) ) ==NULL ) return; //分配空間并檢查
        for( i=0; i< 1024; i++ )
        {
                  *p++ = *ptr++;
        }
        ......
        free( p );
         return;
}
這個(gè)函數(shù)考慮了動態(tài)申請內(nèi)存,以及釋放內(nèi)存,但是忽略了一點(diǎn),就是在釋放前p的值已經(jīng)發(fā)生了改變,所以free(p)函數(shù)執(zhí)行失敗。因此仍然會造成內(nèi)存泄漏。要應(yīng)對這種問題,就是要保存p指針,例如可以采用如下方式:
* ( p+i) = *(ptr+i)   ;       或者 *( p + i)= *ptr++;
這樣就回避了以上問題。






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1