2016-08-12 12 views
0
  1. のcalloc後に反射しないC:メモリ使用量は、私が実行

    のcalloc(* 1024×1024×1024、はsizeof(INT))。

  2. 私は私のプログラムの使用状況を確認し、それがゼロだが、私はfree

編集に電話をしたことはありません:私は

:Debianのジェシー

編集2を実行

上部をシステムモニタとして使用する

+1

メモリの使用状況をどのように確認したか、他の人が実際に何を意味しているかなど、あなたの質問に関する詳細情報を提供してください。 – oxnz

+0

一番上で見たのはどの列ですか?トッププログラムがメモリ使用量を最寄のMBまたはMBの1/10に丸めていないことは確かですか? – nos

+0

私たちはあなたが何をコードしようとしているのか、何を推測すべきでしょうか?私は参照してくださいいくつかのコード – Michi

答えて

5

Linuxはレイジーメモリ割り当てを行いません。割り当てられているとマークされたページでページフォルトが発生した場合に限り、Linuxは実際には使用されていると見なします。割り当てられたデータ内のバイトに書き込みを行い、メモリ使用量を再度確認してください。 Linuxでのメモリ割り当ての詳細については、http://www.tldp.org/LDP/tlk/mm/memory.htmlを参照してください。

さらに、callocは割り当てられたメモリをゼロにしても、記述した振る舞いにつながるレイジーなやり方で実行できます。 How to lazy allocate zeroed memory?を参照してください。

+0

を示してください。値を4GBに変更したところ、値をランダムな整数に設定したときにしか動きませんでした。 – peter

1

あなたの例では数Kしか割り当てられませんが、見た目は小さすぎるかもしれません。しかし、はるかに大量のメモリを要求する場合でも、実際にメモリを使用するまで使用量は表示されません。

デフォルトでは、Linuxは何らかの方法でメモリページに触れるまで、メモリページを実際に割り当てません。 callocはメモリをゼロに初期化することになっていますが、これは内部的に初期化されていないページを追跡し、読み込み時に0を返すため、メモリに触れると数えません。

+1

しかし、 'calloc'はメモリを初期化します。 – peter

+0

mwkの答えを参照してください。 callocはメモリを初期化すると主張していますが、現代のLinuxプラットフォームでの最適化として、新しく割り当てられた仮想メモリが既にゼロになっているという事実を利用するだけです。このようなプラットフォームでmallocを使用することで、基本的にはゼロメモリを得ることができますが、コードが移植されているか、別のプラットフォームで実行されている可能性があるので、callocを常に呼び出すべきです。本当。 – wojtow

+0

ああ、私は感謝の男を見る – peter

関連する問題