メモリ学習 (3) メモリ リーク

1. メモリリークの定義

メモリ リーク、Memory Leak は、プログラムが動的ストレージ割り当て機能を使用して動的に開いた空間を指し、要求されたメモリ空間は使用後に解放されず、プログラムの最後までメモリ ユニットが占有されます。メモリ リークの害は無視できますが、遅かれ早かれどれだけのメモリが占​​有されても、メモリ リークの蓄積の結果は非常に深刻です。

一般に、メモリ リークはヒープ メモリのリークを指します。ヒープメモリとは、プログラムによってヒープから割り当てられたメモリを指し、任意のサイズで、メモリサイズはプログラムの実行中に決定でき、解放されたメモリは使用後に表示する必要があります。一般に、開発者はシステムが提供する基本的なメモリ管理関数 (malloc、recalloc、calloc、free など) を使用して、ヒープからの動的ストレージ変数ストレージ領域の割り当てと解放を完了します。それに応じて free を呼び出す責任があるか、メモリ ブロックを解放するために削除します。そうしないと、このメモリの一部を再度使用できなくなり、このメモリの一部がリークされます。プログラムによって要求されたメモリの一部。それを指すポインタがない場合、このメモリの一部がリークされます

第二に、メモリリークの原因

変数の存在のタイム ライフ サイクルの観点から、C 言語は変数を静的ストレージ変数と動的ストレージ変数に分けます。

1、静态存储变量是指在程序运行期间分配了固定存储空间的变量
2、动态存储变量是指在程序运行期间根据实际需要进行动态地分配存储空间的变量

メモリ内でユーザーが使用するメモリ空間は、プログラム格納領域、静的格納領域、および動的格納領域の3 つの部分に分割されます。

プログラムで使用するデータは、それぞれ静的記憶域と動的記憶域に格納されます。

  1. 静的記憶域のデータは、プログラムの開始時に割り当てられ、それらが占有する記憶域は、プログラムの実行中に固定され、プログラムの終了時に解放されます。
  2. 動的記憶域のデータは、プログラム実行時に必要に応じて動的に確保・解放される記憶単位で、関数パラメータ、ローカル変数、関数呼び出しのリターンアドレスの3種類があります。

3.よくある間違い

  1. メモリのブロックを割り当て、初期化されていない内容を使用する
  2. メモリのブロックを解放しますが、その内容を参照し続けます
  3. サブ関数で割り当てられたメモリ空間は、メイン関数が異常に中断されたとき、またはメイン関数がサブ関数によって返された情報の使用を終了したときに、割り当てられたメモリを解放しません。
  4. プログラムの実行中に割り当てられた一時メモリは、プログラムの終了時に解放されません

第四に、メモリリークの分類

  1. 頻繁なメモリ リーク
    メモリ リークのあるコードは複数回実行され、実行されるたびにメモリ リークが発生します。

  2. 偶発的なメモリ リーク
    メモリ リークが発生するコードは、特定の環境または操作手順でのみ発生します。頻繁と散発は相対的です。特定の環境では、散発性が規則的になる場合があります。したがって、メモリ リークを検出するには、テスト環境とテスト方法が重要です。

  3. 1 回限りのメモリ リーク
    メモリ リークのあるコードは 1 回しか実行されないか、アルゴリズムの欠陥により、常に 1 つのメモリ リークしか発生しません。たとえば、メモリはクラスのコンストラクタで割り当てられますが、デストラクタでは解放されないため、メモリ リークは 1 回だけ発生します。

  4. 暗黙的なメモリ リーク
    プログラムは実行中にメモリを割り当て続けますが、最後までメモリを解放しません。厳密に言えば、プログラムは割り当てられたすべてのメモリを最終的に解放するため、ここではメモリ リークは発生しません。しかし、数日、数週間、さらには数か月にわたって実行する必要があるサーバー プログラムの場合、時間内にメモリを解放しないと、最終的にシステムのすべてのメモリが使い果たされる可能性があります。したがって、このタイプのメモリ リークを暗黙的なメモリ リークと呼びます。

おすすめ

転載: blog.csdn.net/future_sky_word/article/details/125830555