亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

malloc()和free()是如何工作的?

malloc()和free()是如何工作的?

C++
慕尼黑5688855 2019-06-14 10:51:45
malloc()和free()是如何工作的?我想知道malloc和free工作。int main() {     unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char));     memset(p,0,4);     strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes**     cout << p;     free(p); // Obvious Crash, but I need how it works and why crash.     cout << p;     return 0;}如果有可能的話,如果答案是深度的話,我會非常感激的。
查看完整描述

3 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

如aluser所說這個論壇帖子:

您的進程有一個內存區域,從Address x到Address y,稱為堆。你所有的數據都住在這個地區。malloc()保存了堆中所有空閑空間塊的一些數據結構,比如一個列表。當您調用malloc時,它會在列表中查找一個足夠大的塊,返回一個指向它的指針,并記錄它不再空閑的事實以及它的大小。當您使用相同的指針調用free()時,free()將查找該塊的大小并將其添加回空閑塊()列表中。如果調用malloc()而它在堆中找不到足夠大的塊,則使用BRK()SysCall來增長堆,即增加Address y,并使舊y和新y之間的所有地址成為有效內存。BRK()必須是SysCall;沒有辦法完全從用戶空間完成相同的事情。

malloc()依賴于系統/編譯器,因此很難給出具體的答案。但是,基本上它確實會跟蹤它分配了什么內存,并且取決于它是如何分配的,這樣您對空閑的調用就可能失敗或成功。

malloc() and free() don't work the same way on every O/S.


查看完整回答
反對 回復 2019-06-14
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

Malloc/Free的一個實現如下:

  1. 通過sbrk()(Unix調用)從操作系統獲取一個內存塊。
  2. 在該內存塊周圍創建頁眉和頁腳,其中包含一些信息,如大小、權限以及下一個和前一個塊所在的位置。
  3. 當調用malloc時,引用一個指向適當大小的塊的列表。
  4. 然后返回這個塊,并相應地更新標頭和頁腳。


查看完整回答
反對 回復 2019-06-14
  • 3 回答
  • 0 關注
  • 613 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號