c++中句柄的理解-創(chuàng)新互聯(lián)

小編給大家分享一下c++中句柄的理解,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

十余年的紫云網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整紫云建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“紫云網站設計”,“紫云網站推廣”以來,每個客戶項目都認真落實執(zhí)行。

這個句柄只是從英文handle翻譯過來的,只問句是什么意思難以解釋,這個是我從別人的空間收集的信息。

功能上對句柄的理解:

什么是"句柄"(handle),handle的本意是把柄,把手的意思。是你與操作系統(tǒng)打交道的東東。

舉個通俗的例子,比如你考上了大學,入學后,學校(操作系統(tǒng))會給你一個學生證號。

注意,這個號碼是學校指定的,你無法自選。

有了這個號碼(學生證,假設一證多用)享受學校提供的服務:

如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。

但你不能到食堂里買啤酒,因為學校不允許這種服務。

而在計算機中系統(tǒng)提供的服務就是API調用,你有了HANDLE,就可以理直氣壯地向系統(tǒng)提出調用API的服務。

而指針的權力就大多了,有了指針你可以到處去喝酒,打架,學校(操作系統(tǒng))管不著,所以句柄和指針的區(qū)別在于句柄指針調用系統(tǒng)提供的服務。

而句柄雖然是一個能相互區(qū)別的號碼,但與我們普通的ID號又有區(qū)別,普通的ID號是可以由程序員自己定義的,而句柄不行,它是對象生成是系統(tǒng)指定的,是為了區(qū)別系統(tǒng)中存在的各個對象,這個句柄不是由程序員符給的。

概念上對句柄的理解

1、句柄,是整個windows編程的基礎,一個句柄是指使用的一個的整數(shù)值,是指一個四字節(jié)長的數(shù)值,用于標志應用程序中的不同對象和同類對象中的不同的實例,諸如,一個窗口,按鈕,圖標,滾動條,輸出設備,控件或者文件等。

應用程序能夠通過句柄訪問相應的對象的信息。

2、句柄不是一個指針,程序不能利用它句柄來直接閱讀文件中的信息。

如果句柄不用在I/O文件中,它是毫無用處的。

3、句柄是windows用來標志應用程序中建立的或是使用的整數(shù),windows使用了大量的句柄來來標志很多對象。

機制上對句柄的理解

前面的分析很經典,但我認為有一點必須指出的。如果不對,請各位指證。

句柄是指針,一點不假,但是這個指針又與C中的指針有不同之處。

因為Windows是一個多任務的系統(tǒng),其內存是可以移動的,這樣的話如果某一時刻有一個指針指向一塊內存,之后的某個時刻卻被系統(tǒng)移走了,如果你再用這個指針的話就會出錯。

為了解決這一問題,windows在系統(tǒng)專區(qū)開一塊內存用于存放句柄,這個句柄的值就是一個地址,當這一塊內存被移走后,windows就修改這個句柄的值,再訪問這塊內存時,句柄的值總是有效的。

正因為這樣當你使用GlobalAlloc分配的內存時,如果你指定這塊內存的屬性是固定的,那么它的返回值可以直接給一個指針,如果是可以移動的,返回值就必須給一個句柄,你就必須先GlobalLock后才能使用。

其實,句柄是一個指向指針的指針。即:

在windows程序設計中,句柄僅是一個應用程序用來識別某些事情的數(shù)字,如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。

我們知 道,所謂指針是一種內存地址。應用程序啟動后,組成這個程序的各對象是住留在內的 。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那么就可以隨時用這個地址訪問對象。

但是,如果您真的這樣認為,那么您就大錯特錯了。

我們知道,Windows是一個以虛擬內存為基礎的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。

對象被移動意味著它的地址變化 了。如果地址總是如此變化,我們該到哪里去找該對象呢?

為了解決這個問題,Windows操作系統(tǒng)為各應用程序騰出一些內存儲地址,用來專門 登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。

Windows內存管理器在移動對象在內存中的位置后,把對象新的地址告知這個句柄地址來保存。

這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。

這個地址是在對象裝載(Load)時由系統(tǒng)分配給的,當系統(tǒng)卸載時(Unload)又釋放給系統(tǒng) 。句柄地址(穩(wěn)定)→記載著對象在內存中的地址→對象在內存中的地址(不穩(wěn)定) →實際對象.

但是,必須注意的是程序每次從新啟動,系統(tǒng)不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數(shù)情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那么系統(tǒng)給應用程序分配的句柄總是不一樣,這和每次電影院賣給我們的門票總是不同的一個座位是一個道理。

看完了這篇文章,相信你對“c++中句柄的理解”有了一定的了解,如果想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網站欄目:c++中句柄的理解-創(chuàng)新互聯(lián)
當前路徑:http://muchs.cn/article6/dsgoig.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供定制網站、軟件開發(fā)、云服務器、網站改版、全網營銷推廣、營銷型網站建設

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網站