はい、メモリ リークは 2 つの悪のいずれかである可能性があります。正確性は重要ですが、メモリを完全に解放すると、システムのパフォーマンスや安定性が影響を受ける可能性があります。メモリを解放してオブジェクトを破棄するのにかかるリスクと時間は、プロセスを終了するよりも望ましくない場合があります。
一般に、メモリを残しておくことは通常は受け入れられません。コードが実行されるすべてのスコープを理解することは困難であり、場合によっては、リークが壊滅的なものになる可能性があります。
メモリを割り当てて、アプリケーションのコードの最後の行 (グローバル オブジェクトのデストラクタなど) まで使用するとどうなるでしょうか。
この場合、コードはより大きなプロジェクト内に移植される可能性があります。これは、オブジェクトの有効期間が長すぎる (必要なインスタンスだけでなく、プログラム全体で持続する) か、グローバルが作成および破棄された場合にリークすることを意味する場合があります。
アプリケーションが終了したときに、OS がメモリを解放してくれることを信頼しても問題ありませんか?
短期間のプログラムが大きなC++
コレクション (例: std::map
) を作成する場合、オブジェクトごとに少なくとも 2 つの割り当てがあります。オブジェクトを破棄するためにこのコレクションを反復処理すると、CPU にリアルタイムで時間がかかり、オブジェクトがリークして OS によって片付けられるままになると、パフォーマンス上の利点があります。カウンターは、OS によって整頓されていないリソース (共有メモリなど) があり、コード内のすべてのオブジェクトを破棄しないと、これらの解放されていないリソースにいくつかのリソースが保持されているというリスクが生じます。
サードパーティの図書館があなたにこの状況を強制した場合はどうなりますか?
close
まず、リソースを解放する関数のバグを発生させます。それが受け入れられるかどうかの問題は、ライブラリが提供する利点 (コスト、パフォーマンス、信頼性) が、他のライブラリで実行したり、自分で作成したりするよりも優れているかどうかに基づいています。
一般に、ライブラリが再初期化されない限り、私はおそらく気にしません。
メモリリークが報告されるまでの許容時間。
- シャットダウン中のサービス。ここでは、時間のパフォーマンスと正確さの間にトレードオフがあります。
- 破壊できない壊れた物体。失敗したオブジェクトを検出することができました (例: 例外がキャッチされたため)。オブジェクトを破棄しようとすると、結果はハング (保持されたロック) になります。
- メモリ チェッカーの誤報告。
シャットダウン中のサービス
オペレーティング システムをオフにしようとしている場合は、すべてのリソースが整頓されます。通常のプロセスのシャットダウンを実行しないことの利点は、オフにしたときにユーザーがより迅速なパフォーマンスを得られることです。
壊れたオブジェクト
私の過去の中で、オブジェクトが特定のポイントでクラッシュすると壊れてしまい、そのオブジェクトの後続のすべての機能がハングするというオブジェクトを見つけました (そしてそのチームに欠陥を提起しました)。
メモリ リークを無視するのは適切ではありませんが、ハングするよりも、プロセスをシャットダウンしてオブジェクトとそのメモリをリークする方が生産的でした。
リークチェッカーの誤報告
一部のリーク チェッカーは、オブジェクトをインストルメント化し、グローバルと同じように動作します。別のグローバル オブジェクトに有効なデストラクタがあり、終了後に呼び出されてメモリが解放されることを見逃してしまうことがあります。