-10

プログラムの開始とプログラムの終了の間でガベージ コレクションが発生するのはいつですか?

私は C++/CLI を使用していますが、これはガベージ コレクションに関する一般的な質問です。プログラムが完了した後、つまりプログラムのプロセスが強制終了された後にガベージ コレクションが実際に行われるかどうかはわかりません。それとも、プログラムが終了する前にすべてのガベージ コレクションが完了するのでしょうか。

ありがとう

4

4 に答える 4

3

ガベージ コレクションは、メモリを割り当てたときにのみトリガーされます。ジェネレーション 0 ヒープに要求を満たすのに十分なスペースがない場合。いいえ、プログラムが終了しても取得できません。これは、何かを割り当てる場所ではない可能性があります。

GC によって実行される特別な二次ジョブがあり、ファイナライザーを持つオブジェクトに対してファイナライザーも実行します。ファイナライザは、メモリではないオペレーティング システム リソースの解放を処理します。ファイル ハンドル、フォント、デバイス コンテキストなどと同様です。これらは通常、収集されたオブジェクトのガベージ コレクションの後に実行されます。

CLR、AppDomain がアンロードされてプログラムが終了する直前に、これらのファイナライザーを実行します。

于 2013-07-18T15:12:34.690 に答える
2

C++ は、どのタイプのガベージ コレクションも実装していません。

アプリケーションが RAII オブジェクトを使用している場合、オブジェクトの 1 つがスコープ外になる (つまり、デストラクタがスコープの最後で呼び出される) か、例外がスローされるたびに、スタックの巻き戻しを通じてそれらのリソースを収集する必要があります。

RAII の実装とは別に、独自のガベージ コレクションを実装できます (たとえば、高スループットのスレッドがあり、削除呼び出しの待機に時間を費やす余裕がない場合は、それらの削除を担当する別のスレッドにポインターを渡すことができます)。 )。その場合、答えは「実装方法に依存します」です。

ガベージ コレクションをサポートする言語で実装されたアプリケーションでは、実装に依存します。

于 2013-07-18T14:47:57.377 に答える
1

簡単に言えば、あなたは知りませんし、知っておくべきではありません。メモリが極端に制限された環境でない限り、問題にはなりませんが、これらの場合、そもそもマネージ コードを使用するのはなぜでしょうか?

あなたの質問に関する限り、調査時に、すべての .NET 言語がランタイムを共有するため、同じガベージ コレクターがあります。.NET は IL コードのみを認識します。C# で記述したか、C++/CLI で記述したかは問題ではありません。したがって、おそらく「いつ .NET ガベージ コレクターが実行されるか」を検索する必要があります。これは (Google で最初にヒットした)、この SO の質問につながります。いくつかの回答を読むと、知っておくべきことがわかるはずです。

于 2013-07-18T14:56:45.090 に答える
0

基本的に、GC は開始時に実行され、静的またはグローバルとして宣言されたすべての CLI/.Net オブジェクトに基づいてマネージド メモリ表現を構築します (CLI で可能かどうかはわかりません)。

実行中に GC はマネージド参照を追跡し、1 がコードによって参照されなくなった場合、彼はそれを消去する必要があります

  system::string^ st = gcnew system::string; //(1)
  st = gcnew system::string ; (2)

ここで(2)(1)で作成されたrefを上書きするように、GCは(1)で作成したref(メモリ)を取得し、解放するメモリのリストに入れます!CPUとタイムスロットを消費する可能性のあるものを実行する前に、一種のより大きなメモリセットをクリーンアップするのを待つと思うからです!

最後に実行され、「gcnew」で割り当てたすべてのオブジェクトを消去します。そして、すべて静的でグローバルです。

于 2013-07-18T15:09:34.393 に答える