2

私はこの疑問を持っています.10億の要素を持つ配列があり、次のように配列を作成するとします:

int array[1000] = {1,2, ..., n.}

プログラムを終了します。

マシンのJavaガベージコレクションがこの配置のストアに関するメモリクリーンレコードを収集するJavaのようではありません。 それらは記憶にとどまりますか、それとも解放されますか?

4

6 に答える 6

4

プロセスが終了すると、オペレーティング システムはプロセスが使用していたすべてのメモリを解放します。

(これは、特定の小さな組み込みオペレーティング システムには適用されません。)

于 2013-03-25T04:24:15.997 に答える
1

こうすれば

if (true) {
  int array[1000] = {1,2,3};
  //...
}

// array[1000] "freed" here.

次に、「if」ブレースを終了すると、メモリが解放されます。これは、メモリがスタック上にあり、「割り当て」がスタック ポインターの移動にすぎないためです。スコープが終了すると、スタック ポインターはスコープに入る前の場所に戻されます。したがって、この場合、スタックが追加の 1000 個の整数を保持するのに十分な大きさであると仮定すると、割り当てと解放は (パフォーマンスに関して) ほとんど自由です。一部の組み込みシステムではそうではなく、アプリがクラッシュします。

同じことが言えます

int foo( int x )
{
  int array[1000] = {1,2,3};
  // ...
  return array[0];
}

// array[] "freed" here.

編集: 最後のケースで、foo() を main に置き換えると、プログラムの終了時に配列が「解放」されます。

于 2013-03-25T05:33:09.643 に答える
1

プログラムのメモリはオペレーティング システムによって管理されているため、プログラムが終了すると、どのような場合でも解放されます。

いずれにせよ、書かれているように、あなたの割り当ては

  • static であり、関数の外側にあるため (Java で発生するようにヒープで管理されることはありません)、実際には割り当ても解放もされません。
  • スタック上で自動(これは確かに動的ですが、とにかくJavaで行われる方法ではありません)、スコープを出ると解放されます

実際の比較は次のようになります

int *array = malloc(sizeof(int)*1000);

free(array)これは、が呼び出されるか、プログラムが終了するまでメモリに常駐します。

于 2013-03-25T04:24:29.470 に答える
0

簡単に言えば、メモリはプログラムの最後に解放されます。

于 2013-03-25T04:30:40.260 に答える
0
  1. 通常、OS では、int a[10000000000000000000].
  2. それらの値はメモリに残ります。でも、記憶は戻ってきます。
于 2013-03-25T04:24:30.380 に答える
0

cでは、a[1000]のように配列を定義すると、スタック部分に割り当てられ、プログラムが存在すると自動的にメモリが解放されます。ただし、(malloc を使用して) 動的に割り当てる場合は、メモリを解放するために free(array) を使用する必要があります。配列の最大サイズは、システムの RAM サイズによって異なります。

于 2013-03-25T05:05:40.003 に答える