64

私はこのコードに偶然出くわしましたが、それが何を意味するのか作者に尋ねに行くことを誇りに思っています。

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

gcnew単に の代わりにそれを使用することの重要性とは何newですか? (私もキャレットに困惑しています。ここでそれについて尋ねました。)

4

3 に答える 3

79

gcnewは.NET参照オブジェクト用です。gcnewで作成されたオブジェクトは、自動的にガベージコレクションされます。CLRタイプでgcnewを使用することが重要です

于 2008-10-14T19:18:43.290 に答える
49

gcnewは演算子ですが、演算子を使用して作成するnew必要がないことを除けば、演算子と同じです。収集されdeleteガベージですgcnew.Netマネージドタイプの作成、およびアンマネージドタイプの作成に使用しnewます。

于 2008-10-14T19:19:19.937 に答える
6

型を宣言するとき、キャレット '^' は C/C++ の '*' と同様に機能します。

// pointer to new std::string object -> memory is not garbage-collected
std::string* strPtr = new std::string;

// pointer to System::String object -> memory is garbage-collected
System::String^ manStr = gcnew System::String;

管理対象オブジェクトは、C/C++ のポインターのように「nullptr」と比較できるため、「ポインター」という用語を使用します。C/C++ の参照は、既存のオブジェクトのアドレスであるため、'nullptr' と比較できません。

管理対象オブジェクトは自動参照カウントを使用します。つまり、参照カウントがゼロになると自動的に破棄されますが、2 つ以上の到達不能なオブジェクトが相互に参照している場合でも、メモリ リークが発生します。自動参照カウントは、パフォーマンスに関して無料ではないため、賢明に使用してください。

于 2016-04-26T11:04:18.390 に答える