よくあるメモリバグ
メモリリークとダングリングポインタを防ぎます
「よくあるメモリバグ」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
メモリリーク
メモリリークは、ヒープメモリを割り当てたまま解放しないと発生します。プログラムは、もはや到達できないメモリを消費し続けます。
void leak() {
int* p = new int(5);
// missing delete p; -> leaked
}ダングリングポインタ
ダングリングポインタは、すでに解放されたメモリを指すポインタです。デリファレンスすると未定義動作になります。
int* p = new int(7);
delete p;
// *p = 3; // BUG: dangling accessダブルフリー
同じポインタに対して delete を2回呼び出すと、ヒープが破壊され、プログラムがクラッシュすることがよくあります。
int* p = new int(1);
delete p;
// delete p; // BUG: double free解放後使用
オブジェクトを削除した後にポインタを通じて読み書きすることを解放後使用といい、セキュリティ脆弱性の一般的な原因になります。
バッファオーバーラン
配列の末尾を越えて書き込むと、無関係なメモリが上書きされます。常に範囲内に収めてください。
int a[3] = {1, 2, 3};
// a[3] = 99; // BUG: out of boundsdelete の不一致
new[] で割り当てたメモリに delete を使う(またはその逆)と、未定義動作になります。必ず対応する組み合わせで使ってください。
int* arr = new int[4];
// delete arr; // BUG: should be delete[] arr;
delete[] arr; // correct未初期化ポインタ
未初期化のポインタには、意味のない値が入っています。必ず有効なアドレスか nullptr で初期化してください。
#include <iostream>
int main() {
int* p = nullptr; // safe default
if (!p) std::cout << "not set\n";
}ローカル変数のアドレスを返す
スタック上のローカル変数は関数の戻り時に破棄されるため、そのアドレスを返すと直ちにダングリングポインタが発生します。
int* bad() {
int x = 10;
return &x; // BUG: x is gone
}スマートポインタでリークを防ぐ
生の所有ポインタを std::unique_ptr に置き換えると、ほとんどのメモリリークやダブルフリーを防げます。後片付けが自動的かつ一度だけ行われるためです。
#include <iostream>
#include <memory>
int main() {
auto p = std::make_unique<int>(5);
std::cout << *p << "\n";
} // freed exactly once, automaticallyバグを検出するツール
AddressSanitizer や Valgrind などのツールは、実行時にメモリリーク、ダブルフリー、範囲外アクセスを検出します。テストの一部として活用してください。
検出より予防を優先する
最善の対策は、生の所有権を完全に避けることです。std::vector のようなコンテナやスマートポインタを使えば、ライブラリがメモリを正しく管理してくれます。
理解度チェック
メモリ関連のバグについての理解度を確認しましょう。
まとめ
典型的なメモリ関連のバグとして、メモリリーク、ダングリングポインタ、ダブルフリー、解放後使用、バッファオーバーラン、そして delete の不一致について学びました。スマートポインタとコンテナでこれらを防ぎ、残った問題はサニタイザや Valgrind で検出してください。
よくある質問
「よくあるメモリバグ」レッスンは無料ですか?
はい。「よくあるメモリバグ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「よくあるメモリバグ」で何を学びますか?
メモリリークとダングリングポインタを防ぎます ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「よくあるメモリバグ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。