2013-11-04 41 views
1

我有一個函數,其中malloc用於分配一個指針,並將指針傳遞給另一個函數,並傳遞給另一個函數,它使用最後一個函數。釋放指針傳遞到它分配的函數

我的問題是,我可以在該分配的指針的最終函數中免費調用?或者我需要調用malloc被調用的函數。

面臨的問題是,我們看到一個內存泄漏,因爲這個分配的指針的空閒不會被編碼到日期。所以我的工作是立即修復內存泄漏。

回答

1

你可以做,但不能同時做。設計在分配它的同一功能中釋放內存通常會更好。

+0

的代碼?我可能會結束損壞的指針 –

+0

當你不再需要它時,你必須釋放內存。分配 - 呼叫功能 - 免費。 – JIghtuse

+0

對,所以我需要釋放它,一旦我完成使用它,然後 –

1

嚴格地說,你可以在任何地方釋放它,只要你釋放它恰好一次和上次使用後。 1億美元的問題是你如何輕鬆實施這一點,以便將來使用?傳遞所有權轉移語義的指針通常是不好的。一般來說,使用分配轉移返回指針也是不好的。如果你設計一個API,考慮抽象被分配的對象並且有分配/釋放的功能(例如,allocate_widgetfree-widget)。 API使用不應該知道widget已分配malloc(),並且必須與free()一起釋放。

0

您可以在最終函數中爲該分配的指針調用free,但這不是一個好習慣。好的做法是在擁有指向分配內存的主指針的函數內部調用free函數(這可能不是分配內存的函數)。 下面是一個例子:

void func() 
{ 
    void* ptr = malloc(...); // ptr variable declared and initialized here. 
    func2(ptr); 
    func3(ptr); 
    func4(ptr); 
    free(ptr); // Free memory in function where ptr is declared. 
} 

或者,如果mallocfree被incapsulated在更高級別的功能:

void func() 
{ 
    void* ptr = allocateObject(...); // This function calls "malloc". 
    func2(ptr); 
    func3(ptr); 
    func4(ptr); 
    freeObject(ptr); // This function calls "free". 
} 

也考慮是c free功能免費的動態分配的內存,但不改變ptr變量值。 因此,如果遇到內存泄漏,一個好的做法是在調用free之後將指針變量設置爲NULL。這樣一來調試你可能會立即知道如果我釋放,其中分配給它的,慣於指針返回的這就是成爲NULL指針分配內存(ptr != NULL)或無(ptr == NULL

if(ptr != NULL) 
{ 
    free(ptr); 
    ptr = NULL; 
}