16

次のプログラムがあるとしましょう

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
    int * i;

    if ((i = malloc(sizeof(int) * 100)) == NULL) {
        printf("EROOR: unable to allocate memory \n");
        return -1;
    }

    /* memory is allocated successfully */

    /* memory is not free'ed but program terminates */
    // free(i);

    return 0;
}

上記のプログラムはmalloc、メモリを割り当てるために呼び出しますが、割り当てを解除するために呼び出すことはありませんfree。そして、プログラムはメモリの割り当てを解除せずに終了します。

Valgrindはメモリリークを明確に検出します。

<snap>
==14209== HEAP SUMMARY:
==14209==     in use at exit: 400 bytes in 1 blocks
==14209==   total heap usage: 1 allocs, 0 frees, 400 bytes allocated
==14209== 
<sanp>
==14209== LEAK SUMMARY:
==14209==    definitely lost: 400 bytes in 1 blocks
==14209==    indirectly lost: 0 bytes in 0 blocks
==14209==      possibly lost: 0 bytes in 0 blocks
==14209==    still reachable: 0 bytes in 0 blocks
==14209==         suppressed: 0 bytes in 0 blocks
==14209== 
==14209== For counts of detected and suppressed errors, rerun with: -v
==14209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

質問:

プログラムが終了すると、割り当てられたがfree'dではないメモリはどうなりますか?

更新:このコードが別のオペレーティングシステム(Windows、Linux、Solarix、MacOSなど)で実行されていることを考慮してください。終了時のこのコードの動作に違いはありますか?

4

5 に答える 5

14

他の答えはあなたに2つの重要なことを教えてくれます:

  1. はい、メモリはOSによって再利用されるため、技術的には必要ありませんfree()
  2. とにかくあなたがmallocしたすべてを解放することは良い習慣です。

しかし、それがあなたがマロックしたすべてのものに良い習慣である理由を言うことは重要です。free()私からしてみれば:

  1. 習慣:マロックを実行するたびに解放する習慣を身に付けた場合、プログラムの存続期間中、メモリセグメントが存在しないことを誤って忘れることはありません。
  2. 保守性: 誰かがプログラムをリファクタリングして、プログラムの存続期間中メモリのセグメントが存在しなくなった場合、元のクリーンアップコードが存在するということは、リファクタリングされたバージョンにもクリーンアップコードが含まれている可能性が非常に高いことを意味します。 。私にとって、これが最も重要な理由です。
  3. デバッグ:すべてのメモリが正しくクリーンアップされることが期待される場合、実際にリークしているメモリを見つけるのははるかに簡単です。
于 2012-04-19T07:55:31.450 に答える
7

OSは、解放されなかったメモリを再利用します。

ただし、によって割り当てられたすべてのメモリを解放することをお勧めしますmalloc

于 2012-04-19T07:46:32.373 に答える
4

プログラムが終了すると、メモリはオペレーティングシステムによって再利用されます。
OSは、プログラムがメモリをリークしたことを認識しません。実行するためにプログラムにメモリを割り当てるだけで、プログラムが終了すると、そのメモリを再利用します。

ただし、ファイル記述子などの他のリソースは、OSによって再調整される場合とされない場合があり、リソースリークが発生します。

したがって、プログラムを終了する前に、使用したすべてのリソースをプログラムでクリーンアップすることをお勧めします。

于 2012-04-19T07:45:17.170 に答える
1

プロセスがメモリを動的に割り当てるとき、OSからメモリのブロックを借用します。プロセスに割り当てられたメモリが必要ない場合、プロセスは解放されます。次に、OSはそれらのブロックをフリーリストに追加します。プロセスが終了したときにも同じことが起こります。プロセスで使用されるすべてのブロックは、OSによって再利用されます。

詳細については、メモリ管理をお読みください。

于 2012-04-19T07:51:40.680 に答える
0

さらに重要なことに、FREEは、ユーザーによって割り当てられたメモリ/バッファの健全性を保証し、したがって、ヒープの破損を抑制/キャッチするための優れたチェックポイントを存在させます。

于 2014-01-17T05:46:14.653 に答える