2016-04-09 21 views
-2

malloc()を実行してもfree()をしないと、再起動が起こるまでメモリは取得されたままになります。もちろん、私はもちろんそれをテストしました。非常に簡単なコード:C mallocとfree

#include <stdlib.h> 

int main(void) 
{ 
    while (1) malloc(1000); 
} 

そして、私はTask ManagerWindows 8.1)でそれを見守っ。

このプログラムでは、2037.4   MBが本当にすばやく取り上げられました。私はそれがおそらくプログラムを制限するWindowsだと思います。

これは奇妙な部分です:コンソールを閉じたとき、私はそれが想定されていないと教えられたにもかかわらず、メモリ使用率が下がった!

オペレーティングシステムがそれを解放するので、無料で電話するのは冗長ですか?

here以上の質問が関連しているが、非常に私は解放すべきか否かを答えていません。)

+3

あなたのブラウザのように、長い時間がかかるプログラムを考えてみましょう。各スレッドが1メガバイトのWebページ(例を構成)ごとにメモリリークを引き起こす場合は、1日後に何が起こるか想像してください。 'free'を使用してください。それは良い習慣です。 – blazs

+2

メモリがプロセスのライフサイクルを通じて存在する場合は、yesのOSがそれを行います。非常にまれには、プロセスの全生涯にわたって生きる必要があります。 – user3528438

+2

http://stackoverflow.com/q/2215259/1606345 –

答えて

5

Windowsでは、32ビットプロセスは2048メガバイトしか割り当てることができません。これは、そこにいくつのアドレスがあるかということです。このメモリの一部はおそらくWindowsによって逆転されているので、全体の数字は低くなります。 mallocは、失敗したときにnullポインタを返します。これは、その時点で起こる可能性が高いです。あなたはこのような出力を取得する必要があります今

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

int main(void) 
{ 
    int counter = 0; 
    while (1) { 
     counter++; 
     if (malloc(1000) == NULL) { 
      printf("malloc failed after %d calls\n", counter); 
      return 0; 
     } 
    } 
} 

::あなたがいることを確認するには、このようにプログラムを修正することができ

$ ./mem 
malloc failed after 3921373 calls 

プロセスが終了するか、あなたがでそうであるように、それは(外部から終了されたときタスクマネージャを介して強制終了)、プロセスによって割り当てられたすべてのメモリが解放されます。オペレーティングシステムは、どのメモリがどのプロセスに属しているかを管理し、プロセスの終了時にメモリを解放することができます。ただし、オペレーティングシステムは、各プロセスがオペレーティングシステムから要求したメモリをどのように使用しているかを認識しておらず、プロセスがメモリのチャンクを必要としないときにそれを伝えることに依存します。

なぜfree()が必要ですか?これはプログラムの終了時にのみ発生し、必要なメモリとそれ以上必要としないメモリを区別しません。あなたのプロセスが複雑なことをしているとき、しばしばそれ自身の計算のためにメモリを絶えず割り当てて解放しています。これは、そうでない場合、あなたのプロセスは、いくつかの点で、もはや新しいメモリとクラッシュを割り当てることができなくなる可能性がありますので、free()で明示的にメモリを解放することが重要です。可能であればメモリーを解放して、プロセスが不必要に大量のメモリーを消費しないようにすることも、プログラミングの良い習慣です。代わりに、他のプロセスがそのメモリを使用できます。すべての非自明なOSで

4

あなたが得るようにあなたは、あなたが割り当てられたメモリが行われた後、freeを呼び出すすることをお勧めしますこのメモリ空間はプログラムの後半で必要になります。新しい割り当てのためのメモリ領域がない場合は問題になります。 あなたは常にあなたのコードの移植性を求めるべきです。ウィンドウがこのスペースを解放するならば、他のオペレーティングシステムはそうでないかもしれません。

1

オペレーティングシステム内のすべてのプロセスには、プロセスアドレス空間と呼ばれる限られた量のアドレス可能なメモリがあります。膨大な量のメモリを割り当てて、このプロセスで使用できるすべてのメモリを割り当てると、mallocは失敗しNULLを返します。そして、あなたはこのプロセスのためにメモリをもう割当てることができなくなります。

+0

あなたは質問のポイントを逃した。私はOSesがプロセスのメモリを制限していることを知っています。私は自動クリーンアップについて尋ねていました。 –

+0

@AmitGoldいいえ、あなたはOSがプロセスメモリを制限していることを知らないのですが、そうでなければこの質問はしませんでした。あなたの質問は重複しており、Googleでは2秒で見つけられます。 (http://stackoverflow.com/questions/2215259/will-malloc-implementations-return-free-ed-memory-back-to-the-system) –

0

は、プロセス・リソースは、プロセス終了時にOSによって再利用されています。

終了時に明示的にメモリを解放specifcと決定的な理由がない限り、あなたはそれを行う必要はありません、あなたは、少なくともこれらの理由のためにしようとしないでください。

1)あなたはにコードを記述する必要がありますそれをテストし、デバッグしてください。 OSがそれを行うことができるなら、なぜこれを行うのですか?それは単に冗長ではない、あなたのexplictリソース解放は、OSがリリースされる前にすでに持っていたほどのテストを得ることはないので、品質を低下させます。つながるGUIを持つ複雑なアプリケーション、および多くのサブシステムとのスレッドで

2)、クリーンシャットダウン時にメモリを解放することは、とにかく近付いオンに不可能である、:

3)多くのライブラリの開発者は、すでに上あきらめました複雑さがlibsが決して解放されない結果になるので、あなたは明白に言えば...を吐き出す必要があります。多くの人はリリースされていない(紛失されていない)メモリをvalgridに報告し、不透明なライブラリでは何もできません。

4)実行中のスレッドで使用中のメモリを解放しないでください。マルチスレッドアプリケーションですべてのメモリを安全に解放するには、すべてのプロセススレッドが停止していて、再度実行できないようにする必要があります。ユーザーコードにはこれを行うためのツールはありませんが、OSはそうしています。したがって、そのようなアプリでは、ユーザーコードからメモリを明示的に解放することはできません。

5)OSは、大きなチャンクでプロセスメモリを解放することができます。これは、Cマネージャーの何十ものサブアニケーションを使いこなすよりもはるかに迅速です。

6)メモリ管理の問題でプロセスが失敗したためにプロセスが終了している場合、free()を何度も呼び出すことはまったく役に立ちません。

7)教師や教授の多くは、明示的に記憶を解放する必要があると言っているので、明らかに悪い計画です。

関連する問題