我有一個函數,其中malloc用於分配一個指針,並將指針傳遞給另一個函數,並傳遞給另一個函數,它使用最後一個函數。釋放指針傳遞到它分配的函數
我的問題是,我可以在該分配的指針的最終函數中免費調用?或者我需要調用malloc被調用的函數。
面臨的問題是,我們看到一個內存泄漏,因爲這個分配的指針的空閒不會被編碼到日期。所以我的工作是立即修復內存泄漏。
我有一個函數,其中malloc用於分配一個指針,並將指針傳遞給另一個函數,並傳遞給另一個函數,它使用最後一個函數。釋放指針傳遞到它分配的函數
我的問題是,我可以在該分配的指針的最終函數中免費調用?或者我需要調用malloc被調用的函數。
面臨的問題是,我們看到一個內存泄漏,因爲這個分配的指針的空閒不會被編碼到日期。所以我的工作是立即修復內存泄漏。
你可以做,但不能同時做。設計在分配它的同一功能中釋放內存通常會更好。
嚴格地說,你可以在任何地方釋放它,只要你釋放它恰好一次和上次使用後。 1億美元的問題是你如何輕鬆實施這一點,以便將來使用?傳遞所有權轉移語義的指針通常是不好的。一般來說,使用分配轉移返回指針也是不好的。如果你設計一個API,考慮抽象被分配的對象並且有分配/釋放的功能(例如,allocate_widget
和free-widget
)。 API使用不應該知道widget
已分配malloc()
,並且必須與free()
一起釋放。
您可以在最終函數中爲該分配的指針調用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.
}
或者,如果malloc
和free
被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;
}
的代碼?我可能會結束損壞的指針 –
當你不再需要它時,你必須釋放內存。分配 - 呼叫功能 - 免費。 – JIghtuse
對,所以我需要釋放它,一旦我完成使用它,然後 –