← メディア一覧

ポインタの怪談:「free()」の後に残るもの

4分49秒 | アルゴリズム基礎FE

基本情報技術者試験の頻出テーマを解説した動画コンテンツです。

トランスクリプト(字幕テキスト)

どうも、今日はですね、C言語を扱う開発者なら誰でも知っておくべき、ちょっと背筋がゾッとするようなお話をします。 そう、これはポインタにまつわるある怪談なんです。 さあ、物語の登場人物を紹介しましょう。こちら、新人のアキラ君。 彼は自分の書いたコードを先輩のヨミさんに見せて、もう自信満々なんです。完璧だ、って。そう、彼は信じて疑いませんでした。 アキラ君のコードは、まあ一見すると問題なさそうなんですよね。 大きなデータを処理した後、ちゃんと free 関数を呼び出してメモリを解放してる。うーん、良い開発者の心がけですよね。 じゃあ一体、何が問題だったんでしょうか。 でも、経験豊富な先輩、ヨミさんの目は誤魔化せません。 彼の表情はなぜか晴れないまま、アキラ君が完全に見落としていた、ある致命的な点について、 静かに、でも鋭く問いかけるんです。 これです、この一言が全てを物語っています。 このメモ書きっていうのは、ポインタ変数のこと。 そしてその中には、さっき解放したはずのメモリの住所がまだくっきりと生々しく残っているんです。 消えてなんかいなかったんですね。 アキラ君はまだことの重大さに気づいていません。もう解放したんだから大丈夫でしょう、と、 軽い気持ちでそのポインタが指し示すアドレスをもう一度覗き込んでしまうんです。 そして、ここからが本当の怪談の始まりです。 その瞬間、アキラ君のモニターに信じられないものが映し出されました。 そこにあったのは、もう彼が扱っていたデータじゃありませんでした。 ぐちゃぐちゃの文字化けと、え、待ってこれ、全然関係ないプロジェクトの顧客IDじゃないか。 そう、彼は知らず知らずのうちに、もう自分の物ではなくなった領域に不法侵入してしまったんです。 まさに、コンピューターの中に住む幽霊との遭遇です。 この恐ろしい現象を、ヨミさんは見事な例え話で説明します。 この一言でアキラ君は、そして我々もことの真相を理解することになります。 この解体されたアパートの例え、すごくわかりやすいですよね。 まずステップ1。マロックでメモリ、つまりアパートの部屋を借ります。 でステップ2。使い終わったから free で解体して更地にする。 問題はここからです。ステップ3。その更地には OS がすぐに別のプログラムって新しい住人を住まわせるかもしれない。 なのにステップ4で君は、古い部屋番号が書かれたメモを頼りにそこに不法侵入しちゃったわけです。そりゃあトラブルになりますよね。 この解放後も残ってしまう危険なポインタには、ちゃんと名前があるんです。 ダングリングポインタ。日本語だと浮いたポインタなんて言いますけどね。 これはもう、システムプログラミングにおけるまさに呪いのような存在なんです。 じゃあ、どうすればこの幽霊を払って、自分たちのシステムを呪いから守れるんでしょうか。 答えは驚くほどシンプル。でも絶対に守らなければいけない現場の鉄則なんです。 はい、これです。これが唯一にして絶対の解決策。 左が危険なコード。free したのはだけだと PTR の中には、まだ古い住所が残ったまま。 でも右を見てください。free したその直後に PTR = NULL と書く。たったこれだけ。 これでポインタ変数の中にあった古い住所を物理的に消去して、危険な繋がりを完全に断ち切れるんです。安全、確実です。 さて、それでは最後に、今日のこの怪談から我々が得るべき教訓を、 全てのプログラマーが心に刻むべき生存確認リストとして、まとめてみましょう。 いいですか、絶対に覚えて帰ってください。まず試験の罠。 free はメモリを解放するだけで、ポインタ変数の中の住所は消してくれない。これが大前提です。 次に現場の恐怖。その消えてない住所にアクセスしたらどうなるか。 他人のデータを壊すか、最悪プログラムが即クラッシュ。考えただけでも恐ろしいですよね。 だからこそ我々には鉄則が必要なんです。free したら即 NULL。 これで未練を断ち切るんです。もうその住所には未練を残さない。これがプロの作法です。 この free したら即 NULL、このシンプルなルールを心に刻むだけで、あなたの書くコードは格段に安全で、強固なものになります。 あなたのコードに潜む幽霊を払われるのは、あなた自身しかいないんです。 さあ、一度ご自身のコードを見直してみてはいかがでしょうか。 今回の解説は以上です。ありがとうございました。

このコンテンツは Web society で視聴・学習できます。