2013-07-26 77 views
2

發生內存泄漏。代碼有什麼問題?是什麼導致這種內存泄漏?

static sigjmp_buf jmpbuf=NULL; 

static void alarm_func() 
{ 
    siglongjmp(jmpbuf, 1); 
} 
static struct hostent *timeGethostbyname(const char *domain, int timeout) 
{ 
    struct hostent *ipHostent = NULL; 
    jmpbuf=malloc(sizeof(sigjmp_buf)); 
    signal(SIGALRM, alarm_func); 
    if(sigsetjmp(jmpbuf, 1) != 0) 
    { 
     alarm(0); 
     signal(SIGALRM, SIG_IGN); 
     return NULL; 
    } 
    alarm(timeout);//setting alarm 
    ipHostent = gethostbyname(domain); 
    signal(SIGALRM, SIG_IGN); 
    return ipHostent; 
} 

功能有問題timeGethostbyname。如果我多次調用函數timeGethostbyname多次,將發生內存泄漏。 EX:

int main(int argc, char **argv){ 
     char *servers="www.aaa.bbb.tt"; 
     struct hostent *h; 
     while(1){ 
      h=timeGethostbyname(servers, 2); 
     } 

     return(0); 

    } 
+3

使觸發內存泄漏會被刪除,請不要修改你的問題。這使得整個問題變得毫無意義,答案也很混亂(因爲它們涉及的是不是三維的代碼行)。 –

回答

5

你不釋放內存,由malloc的jmpbuf=malloc(sizeof(sigjmp_buf)); 動態分配return ipHostent;之前添加free(jmpbuf)從功能*timeGethostbyname

注意你的代碼運行一個循環來調用分配內存的函數,並且你不斷分配內存,而不是free()

在C中記住,當對象超出範圍時,我們沒有自動管理內存(自由)的垃圾收集器。在C中,您必須顯式釋放內存。使用free()函數。所以即使你變量jmpbuf本地功能timeGethostbyname()你需要在返回前釋放/釋放內存,否則它將保持分配給你的進程(因爲你在新函數調用 - 內存泄漏時丟失內存地址)。

除了內存泄漏,您必須在代碼中收到錯誤/警告,因爲您聲明jmpbuf值爲變量static sigjmp_buf,但不是指針。要麼聲明它的類型爲static sigjmp_buf*,要麼你甚至不需要爲它分配內存。

+1

對不起,該校長是不正確的。我已經更新了正確的版本。我不使用malloc – user2621581

+0

@ user2621581如果你懷疑不清楚讓我知道在評論中,沒有問題。當我注意到你的問題的修訂歷史,我已經刪除了'malloc()'語句是更多的錯誤代碼,因爲你使用'jumpbuf'代替地址,正如我所建議的那樣,你的代碼運行良好。 –

0

那是因爲你沒有釋放由malloc的分配的內存。 malloc的所有分配應該在使用後釋放,否則你會得到內存泄漏。

1

您需要先static sigjmp_buf jmpbuf=NULL;一旦你已經與分配的內存中完成任何你通過malloc分配static sigjmp_buf *jmpbuf=NULL;

然後free

在這種情況下,我認爲你不需要mallocsigjmp_buf如果你這樣做sigjmp_buf jmpbuf=NULL;並使用在全局範圍(數據區)中分配的內存而不是堆。

1

沒有必要分配的內存jmpbuf,因爲是它已經通過如下聲明和定義分配:

static sigjmp_buf jmpbuf=NULL;