プログラムにメモリ リークがあるとします。
1) プロセスが停止した場合 (通常またはセグメンテーション違反)、リークしたメモリは解放されますか?
2)プロセスが保持する他のリソースはどうですか?
ほとんどの最新のオペレーティング システム (Linux、NT 3.5 前後の Windows) では、はい。
1) はい、メモリが解放されます。
2) プロセスモデルが違う?それが何を意味するのかわかりませんが、プログラムが終了すると、それが実行malloc
または実行したメモリはすべてnew
OS に返され、後で別のプログラムに再割り当てされます。
3) プログラムが終了すると、割り当てられたメモリはすべて OS に返されますが、そのプロセスがwait()
別のプロセスによって処理されるまで、誰かがそれを収集するのを待っている終了ステータスなどの少量のデータがあります。Linux では、bash/init からの通常のプロセスが待機し、自動的にクリーンアップされると思います。
最新のシステムでは、スタックとヒープ メモリが解放され、ファイル記述子が閉じられていると思います。
POSIX システムには、プロセスの終了時に解放されないリソース、共有セマフォ、メッセージ キュー、およびメモリ セグメントが多数あります。これらはプロセス間で永続的であることを意図しているため、単純にできません。それらを解放するのはアプリケーションの責任です。
たとえばon_exit
ハンドラーでそれを行うこともできますが、通常はもっと簡単な方法があります。通常、メモリ セグメントの場合は、shm_unlink
すべてのプロセスがそのようなセグメントを開いた後に使用します。最後のプロセス (およびそのセグメントへのファイル記述子) が閉じられると、セグメントは存在しなくなります。
最新のLinuxシステムでは、メモリが解放されると安全に想定できます...ただし...これは保証ではなく、確かにベストプラクティスではありません。