3 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個贊
你可能知道你應(yīng)該準(zhǔn)確地傳回你收到的指針。
因?yàn)閒ree()最初并不知道塊的大小,所以它需要輔助信息才能從其地址中識別原始塊,然后將其返回到空閑列表。它還將嘗試將小的釋放塊與鄰居合并,以產(chǎn)生更有價值的大型空閑塊。
最終,分配器必須具有關(guān)于塊的元數(shù)據(jù),至少它需要在某處存儲長度。
我將描述三種方法。
一個顯而易見的地方是在返回的指針之前存儲它。它可以分配比請求大幾個字節(jié)的塊,將大小存儲在第一個單詞中,然后返回指向第二個單詞的指針。
另一種方法是使用地址作為關(guān)鍵字來保持至少描述已分配塊長度的單獨(dú)映射。
實(shí)現(xiàn)可以從地址中獲取一些信息,從地圖中獲取一些信息。4.3BSD內(nèi)核分配器(我認(rèn)為,稱為“McKusick-Karel分配器”)為小于頁面大小的對象進(jìn)行二次冪分配,并且僅保持每頁大小,從而使得給定頁面的所有分配單一尺寸。
有些類型的第二種,可能是任何類型的第三種類型的分配器都可以實(shí)際檢測到你已經(jīng)提升了指針和DTRT,盡管我懷疑是否有任何實(shí)現(xiàn)會燒掉運(yùn)行時這樣做。

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個贊
大多數(shù)(如果不是全部)實(shí)現(xiàn)將查找數(shù)據(jù)量,以便在您操作的實(shí)際指針之前釋放幾個字節(jié)。做一個狂野free
會導(dǎo)致內(nèi)存映射損壞。
如果你的例子,當(dāng)你分配10個字節(jié)的內(nèi)存時,系統(tǒng)實(shí)際保留,比方說,14。前4個包含你請求的數(shù)據(jù)量(10)然后返回值malloc
是指向第一個字節(jié)的指針未分配的數(shù)據(jù)在14中分配。
當(dāng)你調(diào)用free
這個指針時,系統(tǒng)會向后查找4個字節(jié),知道它最初分配了14個字節(jié),因此它知道要釋放多少。此系統(tǒng)會阻止您將要釋放的數(shù)據(jù)量作為額外參數(shù)釋放給free
自身。
當(dāng)然,其他實(shí)現(xiàn)malloc
/ free
可以選擇其他方式來實(shí)現(xiàn)這一點(diǎn)。但是它們通常不支持與free
指定malloc
函數(shù)返回的指針不同的指針。
- 3 回答
- 0 關(guān)注
- 459 瀏覽
添加回答
舉報(bào)