2015-02-11 52 views
1

我記錄了malloc()free()realloc()C - free()對內存有什麼作用?

我有一個鏈接列表與malloc()返回的指針。

問題是:free()究竟做了什麼?

目前,我做了memset()具有相同的行爲free()

但是,爲了讓它更快,只需在我的列表中設置一個標記爲'免費'而不是執行memset()更好?

+1

'我記得'你什麼意思? – MariusSiuram 2015-02-11 12:16:27

+1

我從來沒有讀過'free()'的實現,但它的行爲不是你明顯想到的,'free()'不會將內存設置爲'0',它只是將它釋放到操作系統,所以它可以其他人可以訪問,但不會將字節清零。 – 2015-02-11 12:16:28

+2

如果您的malloc()實現使用鏈接列表,free()應該將釋放的內存放在空閒列表中。 – wildplasser 2015-02-11 12:16:42

回答

2

通常免費(3)不會對內存本身做任何事情。 (如果擔心安全或隱私問題,則應在釋放內存之前清除內存。)

如果要實現malloc,則需要有一些空閒內存塊的數據庫。當內存被釋放時,如果有任何內存,您應該將它與伴隨空閒內存一起加入。如果一個完整的頁面結束了未使用的,你應該告訴內核,你不需要它了(這取決於你如何在第一時間內存)

+0

好吧,如果我使用'memset',它不像系統調用,但是你personnaly認爲這是像我這樣做的好方法嗎?它是安全的還是我錯過了什麼? – nookonee 2015-02-11 12:37:23

+0

@ nookonee free()通常會將內存返回給內存分配器,所以內存可以在將來對malloc()的調用中再次使用。與memset()相比,這是一個非常不同的東西。 – nos 2015-02-11 13:05:43

+0

@nos好吧,目前我有一個列表,包括我的所有地址和一個標誌,說明它是否免費。所以我設置這個標誌並執行'memset'因此,我可以重新使用它,它被設置爲0,是嗎? – nookonee 2015-02-11 13:35:14

2

C庫函數void free(void *ptr)取消分配先前通過調用calloc,mallocrealloc分配的內存。

您應該使用它來防止內存泄漏。

2

免費:通話將斷開鏈接/ unallocate內存由指針指向,以便其他進程可以使用它。

Memset:調用將設置一個內存/填充內存位置。它不會取消鏈接/取消分配存儲器,並且存儲器保持分配/佔用,直到程序存在。這可能導致內存泄漏。

您可以使用valgrind工具來檢查內存泄漏。

如果不需要,取消鏈接/取消分配內存是一種更好的做法。

相關問題