1. ホーム
  2. c++

[解決済み] メモリリークはどこまで許されるのか?

2022-08-26 16:35:24

質問

何度もメモリリークに遭遇しています。通常、私が malloc -を使っているとき、あるいは FILE * をぶら下げているようなものです。私は一般的に、少なくともプログラムが終了するときにはすべてのメモリがクリーンアップされていると仮定しています (必死で願っています)。プログラムが終了するとき、またはクラッシュするときに、リークしたメモリが回収されないような状況はありますか?

もし答えが言語によって大きく異なるのであれば、C(++)に焦点を当てましょう。

like there's no tomorrow」、「dangling ... like dirty laundry」という大げさな表現にご注意ください。安全でない*。 malloc *は、大切な人を傷つける可能性があります。また、汚れた洗濯物の扱いにもご注意ください。

どのように解決するのですか?

いいえ。オペレーティングシステムは、プロセスが終了するときに、プロセスが保持しているすべてのリソースを解放します。

これは、オペレーティング システムが保持するすべてのリソース (メモリ、開いているファイル、ネットワーク接続、ウィンドウ ハンドルなど) に当てはまります。

とはいえ、プログラムがオペレーティング システムのない組み込みシステムで実行されている場合、または非常にシンプルかバグが多いオペレーティング システムの場合、メモリは再起動するまで使用できないかもしれません。しかし、そのような状況であれば、おそらくこの質問をすることはないでしょう。

オペレーティング システムは、特定のリソースを解放するのに長い時間を要することがあります。たとえば、ネットワーク サーバーが接続を受け入れるために使用する TCP ポートは、プログラムによって適切に閉じられたとしても、空きポートになるまでに数分かかることがあります。また、ネットワーク接続されたプログラムが リモート リソースを保持することがあります。ネットワーク接続が失われたとき、リモート システムはそれらのリソースを解放する必要がありますが、ローカル オペレーティング システムよりもさらに時間がかかることがあります。