我記錄了malloc()
free()
和realloc()
。C - free()對內存有什麼作用?
我有一個鏈接列表與malloc()
返回的指針。
問題是:free()
究竟做了什麼?
目前,我做了memset()
具有相同的行爲free()
。
但是,爲了讓它更快,只需在我的列表中設置一個標記爲'免費'而不是執行memset()
更好?
我記錄了malloc()
free()
和realloc()
。C - free()對內存有什麼作用?
我有一個鏈接列表與malloc()
返回的指針。
問題是:free()
究竟做了什麼?
目前,我做了memset()
具有相同的行爲free()
。
但是,爲了讓它更快,只需在我的列表中設置一個標記爲'免費'而不是執行memset()
更好?
通常免費(3)不會對內存本身做任何事情。 (如果擔心安全或隱私問題,則應在釋放內存之前清除內存。)
如果要實現malloc,則需要有一些空閒內存塊的數據庫。當內存被釋放時,如果有任何內存,您應該將它與伴隨空閒內存一起加入。如果一個完整的頁面結束了未使用的,你應該告訴內核,你不需要它了(這取決於你如何在第一時間內存)
好吧,如果我使用'memset',它不像系統調用,但是你personnaly認爲這是像我這樣做的好方法嗎?它是安全的還是我錯過了什麼? – nookonee 2015-02-11 12:37:23
@ nookonee free()通常會將內存返回給內存分配器,所以內存可以在將來對malloc()的調用中再次使用。與memset()相比,這是一個非常不同的東西。 – nos 2015-02-11 13:05:43
@nos好吧,目前我有一個列表,包括我的所有地址和一個標誌,說明它是否免費。所以我設置這個標誌並執行'memset'因此,我可以重新使用它,它被設置爲0,是嗎? – nookonee 2015-02-11 13:35:14
C庫函數void free(void *ptr)
取消分配先前通過調用calloc
,malloc
或realloc
分配的內存。
您應該使用它來防止內存泄漏。
免費:通話將斷開鏈接/ unallocate內存由指針指向,以便其他進程可以使用它。
Memset:調用將設置一個內存/填充內存位置。它不會取消鏈接/取消分配存儲器,並且存儲器保持分配/佔用,直到程序存在。這可能導致內存泄漏。
您可以使用valgrind工具來檢查內存泄漏。
如果不需要,取消鏈接/取消分配內存是一種更好的做法。
'我記得'你什麼意思? – MariusSiuram 2015-02-11 12:16:27
我從來沒有讀過'free()'的實現,但它的行爲不是你明顯想到的,'free()'不會將內存設置爲'0',它只是將它釋放到操作系統,所以它可以其他人可以訪問,但不會將字節清零。 – 2015-02-11 12:16:28
如果您的malloc()實現使用鏈接列表,free()應該將釋放的內存放在空閒列表中。 – wildplasser 2015-02-11 12:16:42