最終更新: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のインストール:
その他のシステムでのインストール方法については、公式サイトを参照してください:
3.使い方¶
まず、コンパイル時にはdebugの-gを使うことをおすすめします。そうすることで、コードのどの行に問題があるかを検出できます。
次に、次を実行します:
すると、valgrindが私たちに示してくれる情報が得られます:

このとき、上の画像からいくつかの問題が見て取れます:
- Invalid write
val_test.cc::11で発生
- Invalid read
val_test.cc:10で発生
- メモリリーク
1 allocs, 0 frees,3 bytes allocated.
これらの情報によって、どの行のコードに問題があるかを素早く特定できます。
4.gdbデバッグ¶
--vgdb-error=0を付けると、コードを非常に便利にデバッグできるようになり、デバッグしながらどこに問題があるかを確認できます。

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


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