コンテンツにスキップ

最終更新:2026-10-12

C++ メモリリーク検出

C++那些事のメモリ検出方法

C/C++コードを書くとき、メモリの問題はどこにでもあります。仕事でも面接でも、メモリの話題は避けて通れません。

今日は1つの例を使って、valgrindによるC++メモリ検出にStep by Stepで入門します。

3つの問題をシミュレーションします:

  • メモリ解放の問題の検出
  • 書き込みオーバーフローの検出
  • 読み取りオーバーフローの検出

あなたは次のことを学べます:

  • これら3つの問題を検出する方法
  • gdb + valgrindを組み合わせてデバッグする方法

ぜひ一緒に議論しましょう。

1.例の導入

次のコードを見てください。多くの問題があることがわかります:

  • strcpyは安全ではなく、どのくらいのメモリサイズなのか分からず、領域を越える可能性がある
  • print時にmsgに範囲外アクセスしている
  • デストラクタがメモリを解放していない

まるでかつての自分が書いたコードのようではないでしょうか、ハハ。

本節ではこれらの問題を検出していきます。

class Message {
private:
    char *msg;

public:
    Message(const char *text) {
        msg = new char[3];
        std::strcpy(msg, text);
    }

    void printOutOfRange() {
        std::cout << msg[5] << std::endl;
    }

    ~Message() {

    }
};

int main() {
    Message message("hello");
    message.printOutOfRange();

    return 0;
}

2.valgrind

valgrindのインストール:

brew install valgrind // mac
sudo apt-get install install // ubuntu

その他のシステムでのインストール方法については、公式サイトを参照してください:

https://valgrind.org/downloads/

3.使い方

まず、コンパイル時にはdebugの-gを使うことをおすすめします。そうすることで、コードのどの行に問題があるかを検出できます。

g++ val_test.cc -g

次に、次を実行します:

valgrind --leak-check=full ./a.out 

すると、valgrindが私たちに示してくれる情報が得られます:

detect

このとき、上の画像からいくつかの問題が見て取れます:

  • Invalid write

val_test.cc::11で発生

  • Invalid read

val_test.cc:10で発生

  • メモリリーク

1 allocs, 0 frees,3 bytes allocated.

これらの情報によって、どの行のコードに問題があるかを素早く特定できます。

4.gdbデバッグ

--vgdb-error=0を付けると、コードを非常に便利にデバッグできるようになり、デバッグしながらどこに問題があるかを確認できます。

valgrind --leak-check=full --vgdb-error=0 ./a.out 

attach

続いて、gdbでアタッチします

gdb -q a.out

上のtargetの行をgdbに貼り付けて、continueを実行すると、対応する行のコードと、valgrindが出力を続ける情報を見ることができます。

gdb

continue

本節では、みなさんと一緒にメモリ問題を実践しました。お役に立てたなら、ぜひシェアをお願いします。

関連トピック

コメント