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

Valgrind Memcheck 實戰:C/C++ 內存洩漏檢測完全指南

     編輯:關於C++

Valgrind 簡介

Valgrind 是 Linux 下基於軟件模擬的調試分析工具套件。核心是模擬 CPU,工具掛載其上。Memcheck 是默認工具,專檢內存錯誤:未初始化讀寫、釋放後訪問、越界、內存洩漏、分配/釋放不匹配、memcpy 重疊等。

基本用法

# 編譯加調試符號
gcc -g test.c -o test
# 運行 Memcheck 完整洩漏檢查
valgrind --leak-check=full ./test

-g 讓報告包含源碼行號,定位精確。

六大典型錯誤演示

  1. 使用未初始化內存
    char *p; char c = *p;
    報告:Conditional jump or move depends on uninitialised value(s),指出行號。
  2. 讀寫已釋放內存
    char *p = malloc(1); free(p); char c = *p;
    報告:Invalid read of size 1,顯示釋放位置與錯誤位置。
  3. 越界訪問
    char *p = malloc(1); char c = *(p+1);
    報告:Invalid read of size 1,提示塊地址與大小。
  4. 內存洩漏
    char *p = malloc(1); // 忘記 free
    報告:definitely lost: 1 bytes in 1 blocks,給出分配堆棧。
  5. 分配/釋放不匹配
    char *p = (char*)malloc(1); delete p; // C++ delete 對應 new
    報告:Mismatched free() / delete / delete []。
  6. 雙重釋放
    free(p); free(p);
    報告:Invalid free() / delete / delete[] / realloc(),指出首次釋放位置。

進階選項

  • --show-leak-kinds=all:顯示所有類別洩漏(definite/indirect/possible/reachable)。
  • --track-origins=yes:追蹤未初始化值來源(性能代價大)。
  • --vgdb-error=0:錯誤時自動掛載 GDB 調試。

最佳實踐

  1. CI 流程集成 valgrind --error-exitcode=1 讓洩漏導致構建失敗。
  2. 單元測試階段跑 Memcheck,捕獲早期錯誤。
  3. 大型項目用 --suppressions 屏蔽三方庫誤報。

Valgrind 是 C/C++ 開發者的「瑞士軍刀」,熟練使用能消滅 90% 以上內存Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved