したがって、スタック ストレージが使用されるたびに、手動で割り当て解除する必要がありますが、ヒープが使用されている場合、割り当て解除は自動的に行われます。
スタック (関数内のローカル変数) を使用すると、それらは関数の終了 (戻り) 時に自動的に解放されます。
ヒープから割り当てると、割り当てられたメモリは解放されるまで「使用中」のままになります。そうしないと、プログラムが十分に長く実行され、「もの」を割り当て続けると、使用可能なすべてのメモリが使用され、最終的に失敗します。
アプリケーションで「stackfault」から回復することはほとんど不可能であることに注意してください。これは、スタックがいっぱいになるとスタックが使用できなくなり、「エラーから回復」するためのほとんどの操作にはいくつかのスタック メモリの使用が含まれるためです。通常、プロセッサにはスタック フォールトから回復するための特別なトラップがありますが、それがオペレーティング システムに侵入し、アプリケーションがスタックを使い果たしたと OS が判断した場合、多くの場合、まったく慈悲を示さず、アプリケーションをただちに「強制終了」します。 .
1.-関数の無限反復を使用して、再帰ソリューションを使用してプログラムを実行するとします。理論的にはプログラムがクラッシュ (スタック オーバーフロー) しますが、コンピューター自体に問題が発生することはありますか? (おそらくRAMまたはSOに)。
いいえ、コンピューター自体は、これによって害を受けることはありません。プログラムがユーザーが作業しているものを保存していなかった場合、もちろんデータが失われる可能性があります。
ハードウェアの設計が非常に悪い場合を除き、格納されたデータの損失を超えて、コンピューターに害を及ぼすコードを作成することは非常に困難です (もちろん、最初のセクターから最後のセクターまで、ハード ディスク全体を埋めるプログラムを作成する場合は、あなたのデータは、あなたのプログラムがディスクをいっぱいにするもので上書きされます - これにより、ディスクにオペレーティング システムを再インストールするまで、マシンが再起動しない可能性があります)。しかし、RAM とプロセッサが不適切なコーディングによって損傷を受けることはありません (幸いなことに、ほとんどのプログラマは時々間違いを犯します)。
2.- ヒープ上のメモリの割り当てを解除するのを忘れるとどうなりますか。つまり、プログラムに問題を引き起こすだけなのか、それともコンピューター全体に永続的なものなのか. というか、そんな記憶は二度と使えない、とか。
プログラムが終了したら (そして、「メモリが多すぎる」プログラムのほとんどは何らかの形で終了します)。
もちろん、オペレーティング システムや他のアプリケーションが「使用可能なメモリがまったくない」ことをどの程度うまく処理できるかは、少し異なります。オペレーティング システム自体は一般的に問題ありませんが、不適切に記述された一部のドライバーはクラッシュする可能性があり、運が悪いとシステムが再起動する可能性があります。使用可能なメモリがない場合、割り当ては「返されるアドレス」として NULL (ゼロ) になるため、アプリケーションは十分なメモリがないためにクラッシュする傾向があります。最新のオペレーティング システムでアドレス 0 を使用すると、ほとんどの場合、「セグメンテーション違反」または同様の問題が発生します (詳細については、以下を参照してください)。
しかし、これらは極端なケースであり、ほとんどのシステムは、システムの残りの部分が影響を受ける前に、1 つのアプリケーションが使用可能なすべてのメモリを消費するように設定されています。 OS が単に「多くのメモリを消費する」という理由でアプリケーションを強制終了した場合、最初に強制終了されます。Linux には「メモリ不足キラー」があります。これは、システムが動作し続けることを保証するための非常に抜本的な方法です [「動作」の定義による]。
3.- セグメンテーション違反 (ヒープ) を取得する際の問題は何ですか。
セグメンテーション違反は、ヒープとは直接関係ありません。セグメンテーション違反という用語は、さまざまな用途にメモリの「セグメント」を使用していた古いオペレーティング システム (Unix スタイル) に由来し、「セグメンテーション違反」は、プログラムが割り当てられたセグメントの外に出たときでした。最新のシステムでは、メモリは「ページ」に分割されます - 通常はそれぞれ 4KB ですが、一部のプロセッサはより大きなページを持ち、多くの最新のプロセッサは、たとえば 2MB または 1GB の「ラージ ページ」をサポートし、メモリの大きなチャンクに使用されます。 .
ここで、そこにない (または「自分の」ページではない) ページを指すアドレスを使用すると、セグメンテーション違反が発生します。これにより、通常、その場でアプリケーションが終了します。セグメンテーション違反を「トラップ」することはできますが、私が認識しているすべてのオペレーティング システムでは、この「トラップ」から続行しようとすることは有効ではありません。後で、など。