
【堅牢なエラー処理】4.3 ☠️ 致命的な操作
メモリリークは「緩やかな死」ですが、ここで紹介する2つは 「即死」または「セキュリティホール」 に直結する危険なバグです。
1. 💥 二重解放 (Double Free)
同じアドレスに対して `free` を2回呼んでしまうこと。
char *p = malloc(10);
free(p);
free(p); // クラッシュ!ヒープ管理システム(レンタル倉庫の管理人)は、「空き場所リスト」を管理しています。すでに返却された場所をもう一度返却されると、管理台帳が矛盾して壊れてしまいます。
対策: `free` したらすぐに `NULL` を入れる。(`free(NULL)` は何もしないので安全)
free(p);
p = NULL; // 安全策2. 🧟 解放後使用 (Use-After-Free)
`free` した後に、そのポインタを使って読み書きしてしまうこと。
現代のセキュリティ脆弱性で最も危険なものの一つ です。
char *p = malloc(10);
free(p);
// ... しばらくして ...
strcpy(p, "Hacker"); // 危険!なぜ危険なのか?
`free(p)` でメモリが返却される。
別の処理(例えばパスワード管理モジュール)が、その場所を `malloc` して使い始める。
古いポインタ `p` を使って書き込むと、「パスワード管理モジュール用の重要データ」を上書きしてしまう。
これにより、攻撃者がシステムを乗っ取ることが可能になります。

3. 🎣 ダングリングポインタ (Dangling Pointer)
「解放されたのに、まだ実体を指している(つもりになっている)ポインタ」のことを、ぶら下がっている(Dangling)ポインタと呼びます。
教訓:
「死んだ変数(解放済み領域)には死化粧(NULL代入)を」
C言語プログラマの嗜みです。