萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Windows Server 2003 教學

什麼是 Handle(句柄)?Win32 程式設計中如何預防句柄洩漏與溢位

什麼是句柄?

句柄 是 Windows 核心物件的不透明識別碼(數值),用於應用程式參考與操作核心物件(視窗、檔案、執行緒、筆刷、位圖等)。你可以把它想像成「物件的引用編號」,核心透過句柄表管理物件生命週期。

為什麼必須成對呼叫 CloseHandle / DeleteObject?

每個建立的句柄在核心物件的參考計數器上 +1。若建立後未釋放,計數器永不歸零,物件無法銷毀,導致句柄表耗盡(預設上限 16,711,680),最終造成程式崩潰或系統不穩。

典型場景

  • 執行緒:_beginthreadex 回傳句柄,必須 CloseHandle;若用 _beginthread 則不需(也不能)關閉。
  • GDI 物件:CreateBitmap / SelectObject 選入新物件後,必須 SelectObject 選回舊物件,再 DeleteObject 刪除新物件,確保參考計數歸零。

辨識參考計數器增減時機

Windows 核心為每個句柄維護參考計數:

  • Create*、Open*、DuplicateHandle、SelectObject (選入) → 計數 +1。
  • CloseHandle、DeleteObject、SelectObject (選出) → 計數 -1。
  • 計數歸零時核心銷毀物件。

開發者必須清楚每個 API 是否會改變計數,確保增減一一對應。

預防句柄洩漏的實務建議

  1. 查閱 MSDN 官方範例與文件,確認正確用法。
  2. 參考百度百科、技術部落格的實作範例。
  3. 閱讀有註解的開源碼,學習資源管理模式。
  4. 養成「建立即規劃釋放」的防範意識,Code Review 時檢查每個句柄去向。
  5. 避免直接複製大段 Win32 代碼,除非完全理解其資源管理邏輯。

掌握句柄生命週期,是編寫穩健 Windows 原生程式的關鍵基礎。

copyright © 萬盛學電腦網 all rights reserved