私はこの疑問を持っています.10億の要素を持つ配列があり、次のように配列を作成するとします:
int array[1000] = {1,2, ..., n.}
プログラムを終了します。
マシンのJavaガベージコレクションがこの配置のストアに関するメモリクリーンレコードを収集するJavaのようではありません。 それらは記憶にとどまりますか、それとも解放されますか?
プロセスが終了すると、オペレーティング システムはプロセスが使用していたすべてのメモリを解放します。
(これは、特定の小さな組み込みオペレーティング システムには適用されません。)
こうすれば
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 に置き換えると、プログラムの終了時に配列が「解放」されます。
プログラムのメモリはオペレーティング システムによって管理されているため、プログラムが終了すると、どのような場合でも解放されます。
いずれにせよ、書かれているように、あなたの割り当ては
実際の比較は次のようになります
int *array = malloc(sizeof(int)*1000);
free(array)
これは、が呼び出されるか、プログラムが終了するまでメモリに常駐します。
簡単に言えば、メモリはプログラムの最後に解放されます。
int a[10000000000000000000]
.cでは、a[1000]のように配列を定義すると、スタック部分に割り当てられ、プログラムが存在すると自動的にメモリが解放されます。ただし、(malloc を使用して) 動的に割り当てる場合は、メモリを解放するために free(array) を使用する必要があります。配列の最大サイズは、システムの RAM サイズによって異なります。