有關malloc的三個問題

2021-07-30 08:30:17 字數 1132 閱讀 5977

1.如何知道申請的空間就是所需的空間大小

2.free的時候只給了指標那麼如何知道該free多大的空間

3.申請空間的時候怎麼知道哪些用了哪些沒用。

malloc函式是glibc提供的庫函式。glibc的記憶體管理使用的方法是ptmalloc。

ptmalloc對於申請記憶體的大小小於128kb時,分配在堆段,使用系統呼叫brk()或sbrk()。如果大於128kb時,分配在對映區,使用系統呼叫mmap()。

malloc 函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列 表的所謂空閒鍊錶。呼叫 malloc 函式時,它沿連線表尋找乙個大到足以滿足用 戶請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的 大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體 傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。呼叫 free 函式時, 它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體 片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足用 戶要求的片段了。於是,malloc 函式請求延時,並開始在空閒鏈上翻箱倒櫃地 檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。

在malloc開闢空間時,在所分配區域前部,儲存區域。

malloc返回的指標有雙重作用,一是新分配的記憶體起始位址,二是記憶體資源的控制代碼,即管理器內部分配的編號

在呼叫malloc(size)時,實際分配的記憶體大小大於size位元組,這是因為在分配記憶體區域頭部有類似於

struct control_block

;

這樣乙個結構,如果malloc內部得到的記憶體區域的首位址為void p,那麼它返回的就是p+sizeof(control_block),而呼叫free(p)的時候,該函式把p減去sizeof(control_block),然後就可以根據((control_block)p)->size得到要釋放的記憶體區域大小。

malloc首先向glibc查詢是否有足夠大小的記憶體空間可用,如果可用,分配返回即可。如果不可用,malloc將觸發批發操作:brk或者sbrk或者mmap。brk、sbrk或者mmap會修改這個程序的記憶體位址空間相關的資訊。相當於對映的空間便多了,glibc持有的空間變大了,可以夠分配。

有關Wiki的三個應用

8月12日的首屆中文維客已經落幕多日了,而我的心依舊難以平靜。wiki是一種崇尚平等 分享以及積累的文化,其價值自然不言而喻,但是它要真正得到廣大網民的接受和認可,則還有很長的一段路要走。wiki作為一種資訊發布的方式,其複雜性相對於blog bbs和論壇而言要高得多。這個複雜性不僅是對於wiki系...

Color的三個問題

文 王煜全 什麼是color?新一代網路入口?從網際網路到移動網際網路,交流更為高效 內容愈加豐富 應用日益繁榮,這是本質的趨向。然而,使用者如何進入 access 網路,獲得並使用各種應用,這將成為關鍵問題。也就是說,網路應用入口會是在什麼地方?最初,yahoo式的瀏覽導航是入口 後來,以goog...

三個水杯問題

給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入 第一行乙個整數n 0v2 v3 v1 100 v3 0 表示三個水杯的體積。第二行給...