首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

淺談 C/C++ 內存洩漏類型、成因與檢測工具鏈

     編輯:關於C++

內存洩漏定義與分類

狹義:堆內存洩漏(malloc/new 分配未 free/delete)。廣義:系統資源洩漏(HANDLE、GDI Object、SOCKET、COM Interface 等),更嚴重可導致系統不穩。

四種發生模式

類型特徵示例
常發性代碼路徑每次執行都洩漏錯誤分支提前 return 未釋放
偶發性特定環境/操作觸發特定條件下 SelectObject 未恢復導致 GDI 洩漏
一次性程序生命周期僅洩漏一次單例構造分配、析構未釋放
隱式運行中持續分配、僅退出時釋放服務端連接管理未及時清理斷開連接對象

檢測原理

攔截分配/釋放函數,記錄每塊內存生命周期:分配時加入全局鏈表,釋放時移除。程序結束時鏈表剩餘即洩漏塊。同理可擴展至各類資源(SysAllocString/FreeString、CreateMenu/DestroyMenu 等)。

Windows 三大檢測工具

工具原理優點缺點
MS CRT DebugDebug 版 malloc/free/new/delete 內建攔截,_CrtSetDbgFlag 啟用免費、無需修改代碼(MFC 自動支持)、輸出文件行號僅堆內存、需源碼配合(DEBUG_NEW)、無法檢測系統資源
BoundsCheckerCode Injection:DLL 注入修改目標進程 IAT/代碼攔截 API,讀取 PDB 定位源碼與調用棧功能全(參數校驗、越界、洩漏)、無需改源碼、顯示完整調用棧、穩定商業收費、記錄調用棧極慢(默認關閉)、隱式洩漏無能為力
Performance Monitor監控進程 Handle Count、Virtual Bytes、Working Set 計數器能發現隱式洩漏(計數器持續增長)、系統級視角無法定位代碼行、需結合邏輯分析猜測驗證

組合使用策略

  1. 日常開發:MS CRT Debug 免費快速定位堆洩漏行號。
  2. 深度排查:BoundsChecker 開啟調用棧,定位庫封裝層下的真實調用點。
  3. 疑似隱式洩漏:Performance Monitor 監控計數器趨勢,確認存在後結合代碼邏輯分析。

BoundsChecker 關鍵配置

Settings → Error Detection → Custom → Category: Pointer and leak error check → 勾選 Report Call Stack。

總結

  • 內存洩漏類型多樣,隱式洩漏最隱蔽危害大。
  • 工具各有所長,分層組合使用效果最佳。
  • 良好的 RAII、智能指針、所有權清晰設計是源頭預防關鍵。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved