TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

Valgrind C/C++で使えるメモリデバッガ

Valgrind(バルグリンド)とは?– C/C++開発者必須のメモリデバッグツール解説

1. はじめに

CやC++など、メモリ管理を手動で行う言語では、メモリリークやアクセス違反、未初期化変数などが原因で、予測不能なバグが発生しがちです。
それらを効率的かつ網羅的に検出してくれるツールが、今回紹介する Valgrind(バルグリンド)です。

本記事では、Valgrindの基本機能と使い方、出力結果の読み解き方までを丁寧に解説します。


2. Valgrindとは?

Valgrindは、Linux上で動作する動的解析ツールスイートです。
その中でも特に有名なコンポーネントMemcheck で、これは以下のような不具合を検出します:

Valgrindは実行中のプログラムを仮想環境でトレースし、命令ごとのメモリアクセスを監視するため、かなり高精度です。


3. Valgrindのインストール

Ubuntu / Debian

sudo apt install valgrind

Fedora / RHEL

sudo dnf install valgrind

macOS(Homebrew経由。ただし公式サポート対象外)

brew install valgrind

macOSではバージョンによって不安定です。Linux推奨。


4. サンプルコード:メモリリークを含むCプログラム

// leak.c
#include <stdlib.h>

int main() {
    int *p = malloc(sizeof(int) * 10);
    p[5] = 123;
    // free(p); ← 解放し忘れている
    return 0;
}

コンパイルデバッグ情報付き)

gcc -g leak.c -o leak

5. Valgrindの実行と出力

valgrind ./leak

出力例:

==12345== Memcheck, a memory error detector
==12345== LEAK SUMMARY:
==12345==    definitely lost: 40 bytes in 1 blocks
==12345==    indirectly lost: 0 bytes in 0 blocks
==12345==    possibly lost: 0 bytes in 0 blocks
==12345==    still reachable: 0 bytes in 0 blocks
==12345==         suppressed: 0 bytes in 0 blocks

ポイント解説:

  • definitely lost: 確実にリークしているメモリ
  • still reachable: プログラム終了後も解放されなかったが、まだ参照可能
  • suppressed: 無視するよう設定されたメモリ領域

6. よくあるエラー例

二重解放(double free)

free(p);
free(p); // これが原因

Valgrind出力:

Invalid free() / delete / delete[]

未初期化変数の使用

int x;
printf("%d", x); // 初期化されていない

Valgrind出力:

Use of uninitialised value

7. Valgrindの使い方のコツ

  • -g オプション付きでデバッグ情報を含めてコンパイルすること(必須)
  • --leak-check=full で詳細なリーク情報を表示
  • --track-origins=yes で未初期化変数の由来をトレース
valgrind --leak-check=full --track-origins=yes ./leak

8. まとめ

項目 内容
ツール名 Valgrind(バルグリンド)
主な用途 C/C++向けのメモリデバッグ
よく使う機能 Memcheck(メモリ検査)
検出できるもの メモリリーク、二重解放、未初期化、無効アクセスなど
注意点 実行速度が遅くなる、macOSは非公式対応

ValgrindはC/C++プログラマにとって最強のバグ検出兵器です。
開発中・リリース前の検査に取り入れることで、致命的なメモリバグの多くを未然に防ぐことができます。


参考リンク