web-dev-qa-db-ja.com

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

知らないうちにメモリリークをプログラムし、アプリケーションが終了した場合、リークしたメモリは解放されますか?

94

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

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

123
Justin Ethier

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

つまり、Windowsと、これまでに見たすべてのLinuxディストリビューションは、メモリリークを解放します。

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


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

30
Brian R. Bondy

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

13
Vicky

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

9
Jerry Coffin

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

3
Puppy

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

3
ravibhagw