• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列の操作やメモリの確保のミスについて)

配列の操作やメモリの確保のミスについて

このQ&Aのポイント
  • 配列の操作やメモリの確保でエラーが起きた場合、他のプログラムにも影響を与える可能性があるのか?
  • 配列のメモリを確保している際に要素数以上の値を書き込んだり参照したりすると、想定外のメモリ領域に値が書き込まれる可能性があり、他のプログラムの動作に影響を与えることがある。
  • プログラミング初心者が配列の操作やメモリの確保でミスをすると、OSや他のプログラムにエラーが起きる可能性があるのか不安。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

プログラムの詳細を見ていないので推測ですが、malloc で巨大なメモリ領域を確保した為ではないでしょうか。 > 配列の操作やメモリの確保でエラーを起こした場合、OSや他のプログラムにもエラーを引き起こすことがあるのでしょうか? これは OS にも依存する話ですが、現代のパソコン用の OS (Visual Studio 2010 が動くような最近の Windows も含む) では、他のプログラムに直接エラーを引き起こす事はありません。最近の OS は「仮想メモリ」という仕組みを利用して、プログラム毎に「仮想的なメモリ」を定義しています。例えば、プログラムA から見たアドレス 12345 と、プログラム B から見たアドレス 12345 は、物理的には異なる記憶領域に割り当てられます。(細かい事を無視して書くと、) プログラムAのアドレス空間とプログラムBのアドレス空間は重複がない様に物理的なアドレスに割り当てられるので、プログラムAが暴走して他のプログラムの仮想メモリ空間のデータを書き換えてしまうという事はありえません。あくまでプログラムAが異常動作するだけです。 しかし、他のプログラムに間接的に影響を与える可能性として「物理メモリ」の枯渇があるかと思います。プログラム毎にメモリ空間が分かれていたとしても、それを実際に割り当てる先の記憶領域は一つですので、「全てのプログラムが使っているメモリの総量」に上限があります。従って、特定のプログラムが巨大な領域を malloc したり、領域を free せずに malloc し続けると、やがてメモリの上限に達し、どのプログラムも新しくメモリ領域を確保できない状態になってしまいます。この状態になると、どのプログラムでも malloc (に類する操作) に失敗する危険性が出てきます。 しかし、巨大なメモリ領域を占有していたプログラムが終了すれば、そのプログラムの「仮想メモリ」もろとも OS が解放してくれますので、free をし忘れていても後遺症が残るという事はありません。 > explorer.exeを再起動するだけで収まるように見えるのですが、何が起きているのか不思議です。 しかし、話はもう少し複雑です。簡単化していうと、仮想メモリの割当先は主記憶(RAM, いわゆるメモリ)だけではなくて補助記憶(ハードディスク)の一部もその対象です (先に述べたメモリ総量の「上限」は主記憶の大きさよりも大きいです)。但し、補助記憶に割り当ててしまうと動作が遅いので、通常は主記憶だけにメモリを割り当てるものですから explorer.exe なども軽快に動作します。しかし、使用中のメモリが巨大になってくると補助記憶上の領域を使わざるをえなくなるので、その時に休んでいるプログラム (explorer.exe など) のデータを主記憶から補助記憶上に退避してしまいアドレス割当先を退避先の補助記憶に変更してしまいます。 そして、メモリを占有していたプログラムが終了しても、一旦退避した他のプログラムのメモリは補助記憶に退避されたままです。他のプログラムはメモリにアクセスする為に一旦補助記憶装置に読みに行かなければならないので、直後は動作が遅くなってしまいます(動作が遅いだけでエラーにはならない筈です)。しかしそれも、使っている内に、退避したメモリ領域が徐々に補助記憶から主記憶に復帰されるので、その内に軽くなります。まあ、explorer.exe を再起動してしまえば、「徐々に復帰」ではなく、新しく「一気に主記憶にメモリを割り当てる」のですぐに動作が元に戻るのでしょうね。 (分かりやすさのため厳密でない所もあると思いますが、御容赦下さい)

Mods-Rockers
質問者

お礼

ご回答ありがとうございます。 仰るとおり物理メモリの枯渇が原因だったのかもしれません。 いずれにせよ、他のプログラムに影響を及ぼすことはないのですね。安心してプログラミングできます。 ありがとうございました。

関連するQ&A