日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

深入理解malloc和free

發(fā)布時(shí)間:2023/11/27 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解malloc和free 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.為什么free是void*,那么它怎么知道要釋放多少內(nèi)存?

《UNIX環(huán)境高級編程》


《C語言編程常見問題解答》

《你必須知道的495個C語言問題》


《UNIX環(huán)境高級編程》


2.free源碼

內(nèi)存控制塊結(jié)構(gòu)定義

struct mem_control_block {int is_available;int size;
};

可能會認(rèn)為當(dāng)程序調(diào)用?malloc?時(shí)這會引發(fā)問題?——?它們?nèi)绾沃肋@個結(jié)構(gòu)?答案是它們不必知道;在返回指針之前,我們會將其移動到這個結(jié)構(gòu)之后,把它隱藏起來。這使得返回的指針指向沒有用于任何其他用途的內(nèi)存。那樣,從調(diào)用程序的角度來看,它們所得到的全部是空閑的、開放的內(nèi)存。然后,當(dāng)通過?free()?將該指針傳遞回來時(shí),我們只需要倒退幾個內(nèi)存字節(jié)就可以再次找到這個結(jié)構(gòu)。

  在討論分配內(nèi)存之前,我們將先討論釋放,因?yàn)樗唵巍榱酸尫艃?nèi)存,我們必須要做的惟一一件事情就是,獲得我們給出的指針,回退?sizeof(struct mem_control_block)?個字節(jié),并將其標(biāo)記為可用的。

解除分配函數(shù)
void free(void *firstbyte) {struct mem_control_block *mcb;
/* Backup from the given pointer to find the* mem_control_block*/mcb = firstbyte - sizeof(struct mem_control_block);
/* Mark the block as being available */mcb->is_available = 1;
/* That''s It!  We''re done. */return;
}


看一下函數(shù)第二句,這句非常重要和關(guān)鍵。其實(shí)這句就是把指向可用空間的指針倒回去,讓它指向管理信息的那塊空間,因?yàn)檫@里是在值上減去了一個結(jié)構(gòu)體的大小!


3.查找free到底上哪兒查找需要釋放的內(nèi)存大小

都是指針前邊的4個字節(jié)

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{void *p1,*p2,*p3,*p4,*p5,*p6;p1=malloc(10);p2=malloc(38);p3=malloc(100);p4=malloc(200);p5=malloc(106);p6=malloc(300);return 0;}



------------------------------------------

更多內(nèi)容:

malloc()和free()的原理

C語言的malloc()和free()函數(shù)原理【整理】

使用_msize疏忽導(dǎo)致的bug

內(nèi)存管理內(nèi)幕

關(guān)于free如何知道要釋放內(nèi)存空間的長度問題(X86篇) [vs答案]


總結(jié)

以上是生活随笔為你收集整理的深入理解malloc和free的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。