私はこのコードに偶然出くわしましたが、それが何を意味するのか作者に尋ねに行くことを誇りに思っています。
Hashtable^ tempHash = gcnew Hashtable(iterators_);
IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();
gcnew
単に の代わりにそれを使用することの重要性とは何new
ですか? (私もキャレットに困惑しています。ここでそれについて尋ねました。)
gcnewは.NET参照オブジェクト用です。gcnewで作成されたオブジェクトは、自動的にガベージコレクションされます。CLRタイプでgcnewを使用することが重要です
gcnew
は演算子ですが、演算子を使用して作成するnew
必要がないことを除けば、演算子と同じです。収集されdelete
たガベージです。gcnew
.Netマネージドタイプの作成、およびアンマネージドタイプの作成に使用しnew
ます。
型を宣言するとき、キャレット '^' は 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 つ以上の到達不能なオブジェクトが相互に参照している場合でも、メモリ リークが発生します。自動参照カウントは、パフォーマンスに関して無料ではないため、賢明に使用してください。