質問

開発者はメモリリークについて話しているように感じますが、それが何を意味するのかを尋ねると、多くの人は考えがつきません。これらの状況を防ぐために、それを決めましょう。

ウィキペディアの定義は不要です...

  

あなたの最高の定義は何ですか   メモリリーク最善の方法   それらを防ぐには?

役に立ちましたか?

解決

2つの定義があります(少なくとも私にとっては):

単純な定義:割り当てプロセスの実行中に、どのプロセスからも再び割り当てることができない到達不能メモリの解放に失敗しました。これは、GC(ガベージコレクション)技術を使用するか、自動化されたツールで検出することで、ほとんどの場合は解決できます。

微妙な定義:プログラムが正常に機能するために不要になった到達可能メモリの解放の失敗。これは、自動化されたツールまたはコードに精通していないプログラマーによって検出することはほぼ不可能です。技術的にはリークではありませんが、単純なリークと同じ意味を持ちます。これは私自身の考えではありません。ガベージコレクションされた言語で書かれたプロジェクトに出くわすことはできますが、変更ログでメモリリークを修正することに言及しています。

他のヒント

メモリへの参照が失われたため使用できない割り当てられたメモリ。

メモリリソースが割り当てられ、不要になったときに適切に解放されないプロセス。多くの場合、不適切なコーディングプラクティスによって導入されます。

いくつかの言語には、それらを防ぐための方法が組み込まれていますが、それらを回避する最善の方法は、コード実行パスとコードレビューを注意深く観察することです。メソッドを短くし、特別な目的を持たせることは、リソースの使用範囲を厳しくし、シャッフルで迷子になりにくいようにするのに役立ちます。

定義:割り当て後にメモリを解放できません。

w:

  

コンピュータサイエンスでは、メモリリークは、プログラムが不要になったときにメモリを解放できないコンピュータプログラムによる、意図しないメモリ消費の特定のタイプです。この状態は通常、プログラムのバグの結果であり、もはや必要のないメモリを解放することができません。

不要になったときに解放されず、「到達可能」ではなくなったメモリ。たとえば、アンマネージコードで" new"を使用すると、オブジェクトをインスタンス化しますが、「削除」を使用しません。私がそれを終えたとき(そして私のポインタが範囲外になったか何か)。

それらを防ぐ最良の方法は、おそらくあなたが尋ねる人とあなたが使用している言語に依存します。もちろん、ガベージコレクションはこれに適したソリューションですが、これに関連するオーバーヘッドが発生する可能性があります。これは、パフォーマンスが主な関心事でない限り大した問題ではありません。使用している言語によっては、ガベージコレクションが常に利用できるとは限りません。

代わりに、適切な削除やデストラクタがあることを確認できます。メモリリークを検出する方法とツールも多数ありますが、これは使用している言語やIDEに依存します。

メモリリーク:不要になるメモリを解放できない:

  • プログラムは終了します
  • 追加のメモリが割り当てられます

メモリリークを防ぐ最良の方法:不要になったらすぐにメモリを解放します。

メモリリークの定義には2つの方法があります。

まず、データへの参照がなくなったときにデータが解放されない場合、そのデータは到達不能です(破損したポインターがある場合、またはバッファーなどのデータを過ぎて読み取らない限り)。基本的に、ヒープに割り当てられたデータを解放/削除しないと、使用できなくなり、メモリが無駄になります。

ポインタは失われても、データにアクセスできる場合があります。たとえば、ポインターをintに格納する場合、またはポインターへのオフセットを格納する場合(ポインター演算を使用)、元のポインターを戻すことができます。

この最初の定義では、データへの参照の数を追跡するガベージコレクターによってデータが処理されます。

第二に、最後に使用したときにメモリが解放/削除されない場合、本質的にメモリがリークします。参照され、すぐにフリーになりますが、そうしないと間違いがあります。正当な理由があるかもしれませんが(たとえば、デストラクタに奇妙な副作用がある場合)、それはプログラムの設計が悪いことを示しています(私の意見では)。

この2番目のタイプのメモリリークは、ファイルIOを使用する小さなプログラムを作成するときによく発生します。ファイルを開いてデータを書き込みますが、完了したら閉じないでください。 FILE *はまだスコープ内にあり、簡単に閉じることができます。繰り返しますが、これを行うには何らかの理由(他のプログラムによる書き込みアクセスのロックなど)がありますが、私にとってはそれはデザインが悪いことのフラグです。

この2番目の定義では、コンパイラー/インタープリターがそれ以上使用されないことを認識できるほど賢く(または愚かな)場合を除き、データはガベージコレクターによって処理されません。効果。

メモリリークを防止/検出するための手法を次に示します。

  1. メモリ消費の観点からアルゴリズムを検討してください。他の回答者は、メモリリークのために割り当てられたアイテムへのポインタを失う必要はないという事実に言及しています。実装にゼロポインターバグが含まれている場合でも、実際に必要な後、割り当てられたアイテムを長く保持すると、メモリを効果的にリークできます。

  2. アプリケーションのプロファイルを作成します。 ValgrindやPurifyなどのメモリデバッガーツールを使用して、リークを検出できます。

  3. ブラックボックステスト。大量のデータセットをフィードした後、コンパイルされたコードに何が起こるかを観察するか、長期間実行できるようにします。メモリフットプリントが制限なく成長する傾向があるかどうかを確認します。

ここで与えられたすべての定義(これを書いた時点で、より良い答えが得られました)は、ある境界線のケースに対処するのに失敗しています:

作成時にメモリを割り当てるシングルトンがあり、このメモリは通常、現在の使用が行われ、将来の使用が行われるかどうかは不明ですが、プログラムが実行されている限り保持されます。これは通常、再作成のオーバーヘッドのために行われます。

「完了したら解放できません」というこれはリークと見なされますが、メモリがまだ使用されているため、リークレポートツールがリークと呼ぶことがあります。 (実際、コードにはオブジェクトをクリーンアップできるコードが含まれていない場合があります。)

ただし、オブジェクトの再作成のコストがそれほど大きくない場合でも、コンパイラライブラリでこの種のコードに遭遇しました。

漏れるかどうか

編集:この答えは間違っています。あなたがあなたがよく知っていると思うことについて、それがどれほど簡単に誤解されるかの例として残しておきます。私の間違いを指摘してくれたすべての人に感謝します。

メモリリーク:プログラミングエラー。ソフトウェアはシステムからメモリを借用して使用しますが、終了するとシステムに戻すことができません。これは、システムが再起動されるまで、メモリの特定のチャンクが他のプログラムによって使用されることは決してないことを意味します。このようなリークの多くは、利用可能なメモリをすべて使い果たし、完全に役に立たないシステムになってしまいます。

メモリリークを防ぐには、RIIAを練習し、常にソフトウェアをテストしてください。このタスクに使用できるツールはたくさんあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top