Valgrind: メモリリーク検出
malloc/free の対応を確認。リークを特定。
Valgrind
メモリエラー検出ツール。
メモリリーク
解放されないメモリ。
ASan
Address Sanitizer。高速。
Valgrind
# Valgrind の使用
# コンパイル(-g オプション必須)gcc -g -O0 main.c -o main
# メモリリーク検出valgrind --leak-check=full ./main
# 出力例==1234== HEAP SUMMARY:==1234== total heap usage: 10 allocs, 8 frees==1234== definitely lost: 100 bytes in 2 blocks==1234== indirectly lost: 0 bytes==1234== possibly lost: 0 bytes==1234== still reachable: 0 bytes
# エラー種別# - definitely lost: 確実なリーク# - indirectly lost: リークしたポインタ経由で参照不可# - possibly lost: 循環参照などの可能性# - still reachable: 終了時に到達可能(通常は問題なし)Bad
// ❌ Bad: リークに気づかないint* p = malloc(100);p = malloc(200); // 最初の100がリークGood
// ✅ Good: Valgrind で検出// $ valgrind ./program// ==1234== 100 bytes definitely lostパターン
# よく使うオプション
# すべてのリークを表示valgrind --leak-check=full --show-leak-kinds=all ./main
# リークの発生箇所を追跡valgrind --leak-check=full --track-origins=yes ./main
# 子プロセスも追跡valgrind --trace-children=yes ./main
# ログファイルに出力valgrind --log-file=valgrind.log ./main
# その他のツール
# Memcheck(デフォルト)- メモリエラー検出valgrind --tool=memcheck ./main
# Cachegrind - キャッシュヒット率分析valgrind --tool=cachegrind ./main
# Callgrind - 関数呼び出しプロファイリングvalgrind --tool=callgrind ./main# 結果を表示: kcachegrind callgrind.out.*
# Address Sanitizer(代替手段)gcc -fsanitize=address -g main.c -o main./main # 実行時にエラーを検出 Tip: CI/CD に Valgrind を組み込む。
合格ライン
Valgrind でリークを検出できる
出力を読み解ける