萬盛學電腦網

 萬盛學電腦網 >> windows 2003教程 >> 什麼是句柄?win32 如何預防句柄溢出?

什麼是句柄?win32 如何預防句柄溢出?

class="area"> 什麼是句柄?win32 如何預防句柄溢出?對於這個問題,相信不少朋友是不知道的吧,下面電腦知識吧的小編就針對這個問題進行的簡單分析一下吧,希望對大家有幫助!一、什麼是句柄從《Windows內核編程》這本書裡面有寫,你要是問我,句柄是什麼?我想了一下,真回答不出來。如果叫我通俗地敘述,我會說,這是一個“對象”的標記值,而這個值是用來控制你要操作的對象的。用圖簡單描述: 

 二、為什麼很多書籍都強調closehandle(),或者 deleteObject()?場景①如果你做過多線程,那麼你經常會見到Auto h = (HANDLE)_beginthreadex(); //啟動一個線程Close(h); //關閉線程句柄為什麼h調用以後,要做close()?為什麼close()以後就沒有句柄溢出,那麼你應該什麼時候去調用close(),什麼時候又不能太早去調用? 場景②HDC dc;HBITMAP bitmap;HBITMAP old =  SelectObject(dc,bitmap);  //選擇一個bitmap//使用SelectObject(dc,old); //選回舊的DeleteObject(bitmap);如果我們新建一個句柄以後,又不進行釋放。這就像 new 以後沒有delete,沒有釋放的後果是:程序不斷執行,句柄不斷溢出,內存溢出,崩潰。要注意的是,釋放次數也是有規定的,一次就是一次,兩次就是兩次。一一對應。三、認識計數器,要知道windows 什麼時候可能會幫句柄加1計數Windows怎麼知道某個句柄所指定的資源被占用了,怎麼知道已經沒有程序去用他了?簡單來說,每個句柄都有相對應的計數器,當你create以後+1,當被一個對象selectObject(dc,new)以後+1,當該對象SelectObject(dc,other)了其他對象以後被彈出,會-1。具體也是需要看《windows核心編程》,你必須清楚,什麼時候會+1,什麼時候會-1。要知道計數器減到什麼時候,就可以了。在調用api以前應該要這個API是否會把計數器+1,是否會把其他句柄的計數器-1。例如_beginthreadex();要closehandle(),-1;而_beginthread()卻不用。如果勉強去closehandle會出現未定義行為。那麼我們怎麼去避免這種情況?1、 查MSDN看標准的事例、用法2、 查百度百科的事例、用法3、 看別人寫的代碼,最好帶注釋4、 學習、提高自己的防范意識,使用前後要審核句柄有沒有洩漏5、 不輕易直接復制別人的一大段代碼,特別是win32。
copyright © 萬盛學電腦網 all rights reserved