プログラムの終了時に、リークされたメモリは解放されますか?


回答:


151

はい。「メモリリーク」とは、プロセスが参照しなくなったため解放できなくなったメモリのことです。OSは、プロセスに割り当てられたすべてのメモリを引き続き追跡し、そのプロセスが終了すると解放します。

ほとんどの場合、OSはメモリを解放します。Windows、Linux、Solarisなどの通常の「フレーバー」の場合と同様です。ただし、さまざまなリアルタイムオペレーティングシステムなどの特殊な環境では、プログラムの終了時にメモリが解放されない場合があります。


4
質問:OSはすべての割り当てを追跡しますか?割り当てるヒープメモリは、プロセスの仮想メモリ空​​間から取得されます。プロセスが終了すると、その空間はシステムホールセールに返されます。割り当てを行うプロセスは、これらのページにアクセスできる唯一のプロセス(ユーザーランド内)であるため、追加の簿記が必要な理由はわかりません。または私は誤って教えられましたか?
Chris Tonkinson、2010年

6
@ジャスティン:OSを知らなければ、これは有効だとは思いません。多分あなたが話しているOSを明示的に指定します。
ブライアンR.ボンディ

1
注:標準はこれについて何も述べていません。それも保証されません。これは、すべてではないにしても、ほとんどの最新のOSで動作する方法ですが、必須ではありません。以前は、一般的で、このクリーンアップを実行しなかったOSもありました。
Edward Strange

5
リークで失われたメモリを再利用しない、小型デバイス用などのさまざまなリアルタイムOSがあります。あなたの質問はあなたが話しているOSに依存します。
ブライアンニール

14
特定のメモリ保護されたオペレーティングシステムであっても、「リーク」を定義する必要があります。アプリケーションが「システム」リソースを自身のメモリ空間の外に割り当てることは非常に可能です(Windowsの世界では、これらを識別するためにハンドルがよく使用されます)。アプリケーションを閉じても、これらのタイプのリソースが解放されるとは限りません。
David

34

プログラムを実行しているOSは、通常、明示的に解放されていないメモリと明示的に閉じられていないハンドルをクリーンアップしますが、これはC ++標準では保証されていません。あなたはあなたのメモリリークを解放しないいくつかの組み込みデバイスを見つけるかもしれません。

そうは言っても、私が今まで見たWindowsとLinuxのすべてのディストリビューションは、メモリリークを解放します。

自分でテストしてみても、メモリリークの巨大なループを簡単に作成できます。RAMの使用量が増加するのを確認してから、プログラムを閉じます。RAMの使用量が減少していることがわかります。


C ++を使用する際のもう1つの考慮事項は、ヒープに割り当てられたメモリを削除しない場合、デストラクタも呼び出されないことです。デストラクタが呼び出されない場合は、他の副作用も発生することがあります。


14

デスクトップOS(Windows、Linuxなど)で実行していますか?そうであれば、はい、一般に、プログラムが終了すると、システムはプログラムに関連付けられたすべてのメモリを解放します。


10

通常、はい。一部のシステムは、プログラムの終了時に自動的に解放されない共有メモリブロックなどをサポートしています。ほとんどの場合、参照カウントを保持し、それを開いたすべてのプログラムが終了したときに削除しますが、一部は削除しません(たとえば、16ビットWindowsには、何も参照していなくても割り当てられたままになるいくつかのタイプの項目がありましたが、通常、これが蓄積して問題が発生する前に他の理由でクラッシュしました...)


5

私の知る限り、最新のオペレーティングシステムは、プログラムが終了するとこのメモリを解放します。


4

リークしたメモリによって異なります。一部のメモリはOSによって解放できません。ただし、ほとんどのOSのほとんどのメモリは、プロセスが終了すると自動的に再利用されます。


6
一部のメモリは、OSなどで解放できません。

2
一部のリアルタイムOSでは、プロセスの終了時にクリーンアップされない特別なイーサネットバッファーブロックが表示されました。
Brian Neal

1
共有メモリは、一時的なプロセスが使用するために永続化したい場合があるため、通常は再利用されません。
ブライアンニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.