內存句柄與指針的區別

問題: 請專家詳細介紹一下內存句柄與指針的區別。 

    
     指針對應着一個數據在內存中的地址,得到了指針就可以自由地修改該數據。Windows並不希望一般程序修改其內部數據結構,因爲這樣太不安全。所以Windows給每個使用GlobalAlloc等函數聲明的內存區域指定一個句柄(本質上仍是一個指針,但不要直接操作它),平時你只是在調用API函數時利用這個句柄來說明要操作哪段內存。當你需要對某個內存進行直接操作時,可以使用GlobalLock鎖住這段內存並獲得指針來直接進行操作。
    
    lshgao的意見:
    句柄是指針的“指針”,使用句柄主要是爲了利於windows在進程內存地址空間移動分配的內存塊,以防止進程的內存空間被撕的四分五裂而存在過多的碎片。
    
    阿城的意見:
    句柄是一些表的索引也就是指向指針的指針。間接的引用對象,windows可以修改對象的"物理"地址和
    描述器的值,但是句柄的值是不變的。
    
    劉志用的意見:
    句柄和指針都是地址,不同在於:
    1,句柄所指的可以是一個很複雜的結構,並且很有可以是與系統有關的,比如說上面所說的線程的句柄,它指向的就是一個很類或者結構,他和系統有很密切的關係,當一個線程由於不可預料的原因,而終止時在系統就可以回它所佔用的資料,如CPU,內存等等,反過來想可以知道,這個句柄中的某一些項,是與系統進行交互的。由於Windows系統,是一個多任務的系統,它隨時都可能要分配內存,回收內存,重組內存。
    2,指針它也可以指向一個複雜的結構,但是通常是用戶定義的,所以的必需的工作都要用戶完成,特別是在刪除的時候。
    但在VC++6.0中也有一些指針,它們都是處理一些小問題才用的,如最常見的字符的指針,它也是要用戶處理的如果你動態分配了內存;但是Cstring就不要用戶處理了,它其實是VC++中的一個類,所以的操作都由成員函數完成,產生(分配)由構造函數,刪除(回收)由析構函數完成。
    
    相關問題:
    QA000194 "怎樣對經調用API函數GlobalAlloc及GlobalLock得到的內存塊進行讀寫操作"
    
    zjf問:
    你好,我在學習用vc++6.0編譯多線程程序中遇到了很多句柄,但是不明白他的具體作用以及如何使用句柄,希望您能給我舉幾個具體實例,不甚感激!
    比如說: HANDLE hThread,它是怎樣具體使用的?
    答:你使用CreateThead後函數會返回一個句柄,它代表這個線程。你可能會調用SetThreadPriority去修改線程的優先級,使用ResumeThread去重新開始一個線程的運行,在調用這些函數時你都需要告訴系統你到底要操作哪個線程,而剛纔返回的句柄派上用處了,這些函數的第一個參數就是線程的句柄。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章