4

重複の可能性:
C アプリケーションを終了すると、malloc されたメモリは自動的に解放されますか?

Cでは、終了時にポインターを解放する必要がありますか? プログラムが存在する場合、割り当てられたブロックを指しているポインタからメモリを解放しますか?

OS依存ですか?

4

5 に答える 5

10

私が知っていることから、ほとんどの場合、少なくともほとんどの一般的なユーザー OS (Windows、Linux など) では、OS はプロセスの終了時にプロセス メモリを解放します。OS は、プロセスがクラッシュした場合などにもクリーンアップを実行します。

ただし、クリーンアップの実行を OS に依存することは、適切なコーディング手順ではなく、希望どおりに動作することを常に保証できるわけではありません。適切なタイミングでガベージ コレクションを実行したい場合は、常に独自のガベージ コレクションを実行する必要があります (システムがメモリを奇妙な順序でクリーンアップし、無効なポインターを作成して解放しようとしたため、終了時にプログラムがクラッシュしたことがあります)。 )。

プロセス メモリのクリーンアップは、元のプロセスまたはスレッドによって割り当てられたメモリにのみ適用される場合があります。新しいプロセスを生成すると、これらのプロセスが実行され続ける可能性があります。すでに実行中のサービスを使用し、メモリを割り当てて制御できるメソッドを呼び出すと、クリーンアップされない場合があります。

一部のビデオ ドライバーは VRAM をすぐに解放せず、一部の古いカードでは、VRAM を繰り返しリークするプロセスを実行すると、最終的にシステムがクラッシュします。

特にプロセスが再起動または実行を続ける可能性がある場合は、割り当てたメモリを常に解放する必要があります。

于 2010-06-27T02:05:20.173 に答える
6

厳密に必要というわけではありません。実際、これらのポインターを「リーク」して、デストラクタの順序を気にするのを避けると便利な場合があります。

最新のOS がこのメモリをリークすることはなく、プロセスによって使用されるすべてのメモリが再利用されます。

于 2010-06-27T02:05:56.587 に答える
6

プログラムが終了すると、OS はプログラムによって割り当てられたものをすべて解放します。ただし、割り当てたものは常に解放することをお勧めします。

于 2010-06-27T02:04:01.080 に答える
2

これは OS に依存しますが、実際には最新のオペレーティング システムは終了時にすべてのリソースを取り戻す必要があります。

そうは言っても、可能であれば、取得したメモリを解放することをお勧めします。ほとんどの場合、可能です。また、ここでは一般的なリソースではなく、メモリについて話していることを忘れないでください。適切なクリーンアップで実行したいことが他にもあります。OSが推測できず、あなたのためにできないこと。たとえば、外部サービスから切断するか、一時ファイルを削除します。

于 2010-06-27T02:06:24.670 に答える
-2

OSに依存します。ほとんどの場合、ポインターを解放するのを忘れてもそれほど害はありませんが、そうするのも得策ではありません。これにより、メモリ リークが発生する可能性があります。十分に長く発生すると、アクセスできない奇妙なメモリ不足が発生し、他のプログラムが動作するのに十分なメモリがなくなる可能性があります。

ポインターが指している動的に割り当てられた配列を明示的に解放することについて話している場合、要するに、はい、そのプロセスを実行する必要があります。プログラムが終了するとき、プログラムがそのメモリ ブロックを解放していない場合、ポインタはまだ割り当てられたブロックを指していますが、終了時にプログラムが範囲外になるため、アクセスできなくなります。

于 2010-06-27T02:04:42.723 に答える