C++, ID、指针、handle (void *)的区别
原文鏈接:
http://hi.baidu.com/dandanfeng160/blog/item/4eaa3df5215bc42dbd310955.html
在Windows程序設計中,句柄是無法精確定義的術語。隨便找一個高手,讓他給你講講句柄是什么,恐怕他都很難給你一個具體的定義來。
在Windows程序設計中,句柄無所不在,窗口有窗口的句柄HWND,線程和進程也有句柄HANDLE,甚至有人把套接字也稱為句柄(我就是這樣的)。
句柄在英文中是handle,作為動詞講是處理的意思。簡而言之,句柄是處理對象的一個接口,對于程序中所涉及的對象,你可以通過句柄去操作他。你不應該試圖去回答句柄是什么,而應該從務虛的角度去理解他,知道他干什么即可。
有人說,因為handle的定義是void *,因此他是一個指針。有些熟悉內核的人說這是一個索引。這些說法都是不準確的。需要注意的是,微軟并沒有精確定義句柄的含義,也許在某個特殊的操作系統中,他使用了一種內部含義,但是在其他版本中,就不保證這樣了。任何對句柄的內在假設都可能導致災難性的后果。
API是接口,句柄是接口,兩者有什么區別?API是一個通用的函數族,他處理所有的對象,而句柄是和某個具體對象相關聯的數據結構。只有借助句柄,API才知道處理哪個對象。
有些對象有ID。句柄表示特殊的對象,ID也表示某個對象,為什么要兩個東西來表示?
首先,句柄不能唯一表示對象。一個對象可以有多個句柄。例如:假設我們用CreateProcess創建一個進程,該進程的第一個線程的句柄會返回給調用CreateProcess的進程。同時,在新創建的進程中,該線程也會有一個句柄。這樣,這個線程就有兩個句柄。我們也可以用DuplicateHandle復制一個句柄,這個句柄和原來句柄是不一樣的,但是他們都表示同一個對象。而每個有ID的對象,在系統范圍內,ID肯定是唯一的。
其次,句柄所能實現的功能ID不能實現。畢竟ID只是一個數字,他不能記錄很多信息。而句柄可能在其內部結構中記錄了很多信息(如權限、有無信號等)。
總之,如果試圖解釋他到底是什么,學習句柄就會誤入歧途。從虛的角度去理解,對于新手是難一點,但是這也許是唯一正確的辦法。
我們知道,所謂指針是一種內存地址。應用程序啟動后,組成這??個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那么就可以隨時用這個地址?訪問對象。但是,如果您真的這樣認為,那么您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化?了。如果地址總是如此變化,我們該到哪里去找該對象呢?為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門?登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置后,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。句柄地址(穩定)→記載著對象在內存中的地址→對象在內存中的地址(不穩定)→實際對象。但是,必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成?是一個應用程序的啟動運行,那么系統給應用程序分配的句柄總是不一樣,這和每次電?影院售給我們的門票總是不同的一個座位是一樣的道理。
總結
以上是生活随笔為你收集整理的C++, ID、指针、handle (void *)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C语言的数组名和对数组名取地址
- 下一篇: 如何将UCI数据集转换成Matlab可用
