メモリリークとは何ですか?どうすれば避けられるでしょうか?
メモリ リークは、プログラマがヒープ内にメモリを作成し、それを削除し忘れた場合に発生します。
メモリ リークの結果、利用可能なメモリの量が減少し、コンピュータのパフォーマンスが低下します。最終的には、最悪の場合、使用可能なメモリが過剰に割り当てられ、システムまたはデバイスの全体または一部が正しく動作しなくなり、アプリケーションが失敗したり、システムの速度が大幅に低下したりする可能性があります。
メモリ リークは、定義上決して終了しないデーモンやサーバーなどのプログラムにとって特に深刻な問題です。
メモリリークの例
以下の例は、メモリ リークの概念を示しています。
C
/* Function with memory leak */> #include> void> f()> {> > int> * ptr = (> int> *)> malloc> (> sizeof> (> int> ));> > /* Do some work */> > /* Return without freeing ptr*/> > return> ;> }> |
C におけるメモリ リークの原因
- 動的に割り当てられたメモリが free 呼び出しによって解放されない場合、メモリ リークが発生します。 malloc または calloc を使用した動的メモリ割り当てごとに、対応する無料呼び出しがあることを常に確認してください。
- 割り当てられたメモリを参照するポインタの追跡が失われると、メモリが解放されない可能性があります。したがって、すべてのポインタを追跡し、メモリが解放されていることを確認してください。
- プログラムが突然終了し、割り当てられたメモリが解放されない場合、またはコードの一部が free の呼び出しを妨げている場合、メモリ リークが発生する可能性があります。
メモリリークを回避するにはどうすればよいでしょうか?
メモリ リークを回避するには、ヒープに割り当てられたメモリが不要になったときに常に解放する必要があります。
例: メモリリークを避けるためにヒープに割り当てられたメモリを解放するプログラム
以下のプログラムは、メモリ リークを避けるためにヒープに割り当てられたメモリが解放されることを示しています。
C
/* Function without memory leak */> #include> void> f()> {> > int> * ptr = (> int> *)> malloc> (> sizeof> (> int> ));> > /* Do some work */> > /* Memory allocated by malloc is released */> > free> (ptr);> > return> ;> }> |
例: メモリが解放されているかどうかを確認するプログラム
次の例は、ヒープに割り当てられたメモリが解放されているかどうかを確認する方法を示しています。
C
// C Program to check whether the memory is> // freed or not> #include> #include> int> main(> void> )> {> > int> * ptr;> > ptr = (> int> *)> malloc> (> sizeof> (> int> ));> > if> (ptr == NULL)> > printf> (> 'Memory Is Insuffficient
'> );> > else> {> > free> (ptr);> > printf> (> 'Memory Freed
'> );> > }> }> // This code is contributed by sarajadhav12052009> |
出力
Memory Freed
結論
結論として、メモリ リークは、ヒープにメモリを割り当てたにもかかわらず、解放または解放するのを忘れた場合に発生する可能性があります。メモリリークにより、パフォーマンスの低下が発生したり、システムが不安定になったりする可能性があります。メモリ リークは、サーバーなどの長時間実行されるプログラムにさらなる損害を引き起こします。メモリ リークを回避するには、free() などの関数を呼び出して、動的に割り当てられたメモリを解放する必要があります。