欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
c語言的內存泄漏問題
[打印本頁]
作者:
51黑黑黑
時間:
2016-2-21 15:40
標題:
c語言的內存泄漏問題
我們先從一個函數來分析內存泄漏的原因:
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++;
這樣就回避了以上問題。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1