5

プログラムにメモリ リークがあるとします。

1) プロセスが停止した場合 (通常またはセグメンテーション違反)、リークしたメモリは解放されますか?

2)プロセスが保持する他のリソースはどうですか?

4

4 に答える 4

7

ほとんどの最新のオペレーティング システム (Linux、NT 3.5 前後の Windows) では、はい。

于 2012-08-18T02:43:46.120 に答える
2

1) はい、メモリが解放されます。

2) プロセスモデルが違う?それが何を意味するのかわかりませんが、プログラムが終了すると、それが実行mallocまたは実行したメモリはすべてnewOS に返され、後で別のプログラムに再割り当てされます。

3) プログラムが終了すると、割り当てられたメモリはすべて OS に返されますが、そのプロセスがwait()別のプロセスによって処理されるまで、誰かがそれを収集するのを待っている終了ステータスなどの少量のデータがあります。Linux では、bash/init からの通常のプロセスが待機し、自動的にクリーンアップされると思います。

于 2012-08-18T04:04:42.053 に答える
2

最新のシステムでは、スタックとヒープ メモリが解放され、ファイル記述子が閉じられていると思います。

POSIX システムには、プロセスの終了時に解放されないリソース、共有セマフォ、メッセージ キュー、およびメモリ セグメントが多数あります。これらはプロセス間で永続的であることを意図しているため、単純にできません。それらを解放するのはアプリケーションの責任です。

たとえばon_exitハンドラーでそれを行うこともできますが、通常はもっと簡単な方法があります。通常、メモリ セグメントの場合は、shm_unlinkすべてのプロセスがそのようなセグメントを開いた後に使用します。最後のプロセス (およびそのセグメントへのファイル記述子) が閉じられると、セグメントは存在しなくなります。

于 2012-08-18T06:40:38.377 に答える
1

最新のLinuxシステムでは、メモリが解放されると安全に想定できます...ただし...これは保証ではなく、確かにベストプラクティスではありません。

于 2012-08-18T03:00:27.423 に答える