小編給大家分享一下c++中句柄的理解,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)服務項目包括城步網(wǎng)站建設、城步網(wǎng)站制作、城步網(wǎng)頁制作以及城步網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,城步網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到城步省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
這個句柄只是從英文handle翻譯過來的,只問句是什么意思難以解釋,這個是我從別人的空間收集的信息。
功能上對句柄的理解:
什么是"句柄"(handle),handle的本意是把柄,把手的意思。是你與操作系統(tǒng)打交道的東東。
舉個通俗的例子,比如你考上了大學,入學后,學校(操作系統(tǒng))會給你一個學生證號。
注意,這個號碼是學校指定的,你無法自選。
有了這個號碼(學生證,假設一證多用)享受學校提供的服務:
如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。
但你不能到食堂里買啤酒,因為學校不允許這種服務。
而在計算機中系統(tǒng)提供的服務就是API調(diào)用,你有了HANDLE,就可以理直氣壯地向系統(tǒng)提出調(diào)用API的服務。
而指針的權(quán)力就大多了,有了指針你可以到處去喝酒,打架,學校(操作系統(tǒng))管不著,所以句柄和指針的區(qū)別在于句柄指針調(diào)用系統(tǒng)提供的服務。
而句柄雖然是一個能相互區(qū)別的號碼,但與我們普通的ID號又有區(qū)別,普通的ID號是可以由程序員自己定義的,而句柄不行,它是對象生成是系統(tǒng)指定的,是為了區(qū)別系統(tǒng)中存在的各個對象,這個句柄不是由程序員符給的。
概念上對句柄的理解
1、句柄,是整個windows編程的基礎(chǔ),一個句柄是指使用的一個唯一的整數(shù)值,是指一個四字節(jié)長的數(shù)值,用于標志應用程序中的不同對象和同類對象中的不同的實例,諸如,一個窗口,按鈕,圖標,滾動條,輸出設備,控件或者文件等。
應用程序能夠通過句柄訪問相應的對象的信息。
2、句柄不是一個指針,程序不能利用它句柄來直接閱讀文件中的信息。
如果句柄不用在I/O文件中,它是毫無用處的。
3、句柄是windows用來標志應用程序中建立的或是使用的唯一整數(shù),windows使用了大量的句柄來來標志很多對象。
機制上對句柄的理解
前面的分析很經(jīng)典,但我認為有一點必須指出的。如果不對,請各位指證。
句柄是指針,一點不假,但是這個指針又與C中的指針有不同之處。
因為Windows是一個多任務的系統(tǒng),其內(nèi)存是可以移動的,這樣的話如果某一時刻有一個指針指向一塊內(nèi)存,之后的某個時刻卻被系統(tǒng)移走了,如果你再用這個指針的話就會出錯。
為了解決這一問題,windows在系統(tǒng)專區(qū)開一塊內(nèi)存用于存放句柄,這個句柄的值就是一個地址,當這一塊內(nèi)存被移走后,windows就修改這個句柄的值,再訪問這塊內(nèi)存時,句柄的值總是有效的。
正因為這樣當你使用GlobalAlloc分配的內(nèi)存時,如果你指定這塊內(nèi)存的屬性是固定的,那么它的返回值可以直接給一個指針,如果是可以移動的,返回值就必須給一個句柄,你就必須先GlobalLock后才能使用。
其實,句柄是一個指向指針的指針。即:
在windows程序設計中,句柄僅是一個應用程序用來識別某些事情的數(shù)字,如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。
我們知 道,所謂指針是一種內(nèi)存地址。應用程序啟動后,組成這個程序的各對象是住留在內(nèi)的 。如果簡單地理解,似乎我們只要獲知這個內(nèi)存的首地址,那么就可以隨時用這個地址訪問對象。
但是,如果您真的這樣認為,那么您就大錯特錯了。
我們知道,Windows是一個以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動對象,依此來滿足各種應用程序的內(nèi)存需要。
對象被移動意味著它的地址變化 了。如果地址總是如此變化,我們該到哪里去找該對象呢?
為了解決這個問題,Windows操作系統(tǒng)為各應用程序騰出一些內(nèi)存儲地址,用來專門 登記各應用對象在內(nèi)存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。
Windows內(nèi)存管理器在移動對象在內(nèi)存中的位置后,把對象新的地址告知這個句柄地址來保存。
這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內(nèi)存中的哪個位置。
這個地址是在對象裝載(Load)時由系統(tǒng)分配給的,當系統(tǒng)卸載時(Unload)又釋放給系統(tǒng) 。句柄地址(穩(wěn)定)→記載著對象在內(nèi)存中的地址→對象在內(nèi)存中的地址(不穩(wěn)定) →實際對象.
但是,必須注意的是程序每次從新啟動,系統(tǒng)不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數(shù)情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那么系統(tǒng)給應用程序分配的句柄總是不一樣,這和每次電影院賣給我們的門票總是不同的一個座位是一個道理。
看完了這篇文章,相信你對“c++中句柄的理解”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!