最近兩天在復(fù)習(xí)一些c++的知識(shí),中間發(fā)現(xiàn)了許多以前沒有注意過的問題锨咙。關(guān)于句柄以前總是將其理解為指針,其實(shí)不然追逮,他們之間有著明顯的區(qū)別酪刀。
首先,指針指向系統(tǒng)中物理內(nèi)存的地址羊壹,而句柄是windows在內(nèi)存中維護(hù)的一個(gè)對(duì)象內(nèi)存物理地址列表的整數(shù)索引蓖宦,句柄是一種指向指針的指針。
在windows系統(tǒng)中的內(nèi)存管理一般會(huì)將當(dāng)前處于空閑狀態(tài)的對(duì)象的內(nèi)存釋放掉油猫,當(dāng)需要訪問的時(shí)候再重新提交分配物理內(nèi)存稠茂,從而導(dǎo)致對(duì)象的物理地址是變化的,
這樣就不允許系統(tǒng)直接通過指針來訪問(物理地址不斷變化)的對(duì)象。
句柄是一種指向指針的指針睬关。由于windows是一種以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)诱担,其內(nèi)存管理器經(jīng)常會(huì)在內(nèi)存中來回的移動(dòng)對(duì)象,以此來滿足各種應(yīng)用程序?qū)?nèi)存的需求电爹。
而對(duì)象的移動(dòng)意味著對(duì)象內(nèi)存地址的變化蔫仙,正是因?yàn)槿绱耍绻苯邮褂弥羔権ぢ幔趦?nèi)存地址被改變后摇邦,系統(tǒng)將不知道到哪里去再調(diào)用這個(gè)對(duì)象。
windows系統(tǒng)為論文解決這個(gè)問題屎勘,系統(tǒng)專門為各種應(yīng)用程序騰出了一定的內(nèi)存地址(句柄)專門用來記錄這些變化的地址(這些內(nèi)存地址就是指向指針的指針)施籍,這些內(nèi)存地址本身是一直不變化的。windows內(nèi)存管理器在移動(dòng)某些對(duì)象之后概漱,他會(huì)將這些對(duì)象新的內(nèi)存地址傳給句柄丑慎,告訴他移動(dòng)后對(duì)象去了哪里。
句柄(穩(wěn)定的)----->記載著對(duì)象在內(nèi)存中的地址---->對(duì)象在內(nèi)存中的地址(不穩(wěn)定的)---->記載著實(shí)際對(duì)象的地址瓤摧。
圖中實(shí)線表示初始化的情況竿裂,虛線表示在內(nèi)存管理器處理之后的情況