電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 38|回復(fù): 0
收起左側(cè)

malloc申請的內(nèi)存空間,free是如何準(zhǔn)確釋放的?

[復(fù)制鏈接]

613

主題

613

帖子

1765

積分

三級會員

Rank: 3Rank: 3

積分
1765
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-5 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

點擊上方藍色字體,關(guān)注我們

以下是我的一些看法。

malloc 和 free 實際上是依賴于 C 庫和操作系統(tǒng)提供的內(nèi)存管理機制,它們基于特定的數(shù)據(jù)結(jié)構(gòu)和算法來管理動態(tài)分配的內(nèi)存。
1
malloc 內(nèi)存分配的實現(xiàn)
當(dāng)你調(diào)用 malloc 分配內(nèi)存時,C 運行時庫(如 glibc)會從堆中分配一塊內(nèi)存。在這個過程中,分配器會維護一個內(nèi)部的 “自由鏈表”(free list)或其他數(shù)據(jù)結(jié)構(gòu)來追蹤哪些內(nèi)存塊是空閑的,哪些是已分配的。

當(dāng)需要分配內(nèi)存時,分配器會從自由鏈表中找到合適大小的空閑塊,然后將這塊內(nèi)存返回,并在鏈表中更新其狀態(tài)。
2
free 釋放內(nèi)存的原理
在 free 時,分配器需要知道內(nèi)存塊的起始地址以及它的大小,以便將其標(biāo)記為空閑并重新加入自由鏈表。你提到的“如何知道要釋放的內(nèi)存大小”是一個關(guān)鍵問題,這確實依賴于內(nèi)存分配器內(nèi)部的數(shù)據(jù)結(jié)構(gòu)。

通常分配器會在每個分配的內(nèi)存塊前增加一個 “頭部”(header),這個頭部存儲了該內(nèi)存塊的元信息,包括分配的大小和狀態(tài)(空閑或已分配)。因此,當(dāng)你傳遞指針 p 給 free 時,分配器可以通過 p 之前的頭部信息找到整個塊的大小,然后正確釋放該塊。
3
為什么 free(p + 6) 仍然能釋放整個塊
在 C 中,標(biāo)準(zhǔn)庫實現(xiàn)中并不支持直接釋放偏移后的地址(如 p + 6)。嘗試調(diào)用 free(p + 6) 實際上會導(dǎo)致未定義行為,具體表現(xiàn)取決于實現(xiàn),但通常會導(dǎo)致程序崩潰或產(chǎn)生錯誤。
4
數(shù)據(jù)結(jié)構(gòu)和性能優(yōu)化
典型的內(nèi)存分配器使用 雙向鏈表 或 分離鏈表 來維護空閑和已分配的內(nèi)存塊,以便快速找到和釋放內(nèi)存。自由鏈表通常按大小分段存儲,以便在釋放時找到最合適的塊,減少碎片化。

在一些高級分配器(如 tcmalloc 或 jemalloc)中,使用了更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如 哈希表或樹狀結(jié)構(gòu)(如紅黑樹)來管理和分配內(nèi)存。這種結(jié)構(gòu)優(yōu)化了查找速度,并通過不同大小的塊分區(qū)降低了碎片化程度。


點擊閱讀原文,更精彩~
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表