2008-10-14 2 views
39

Ich bin über diesen Code gestolpert und bin zu stolz, um den Autor zu fragen, was es bedeutet.Was ist gcnew?

Hashtable^ tempHash = gcnew Hashtable(iterators_); 

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator(); 

Was gcnew ist und wie wichtig es ist, dass zu verwenden, anstatt einfach new? (Ich bin auch von der Caret ratlos; ich fragte nach dem over here.)

+2

Sie können über einige der C++/CLI-Funktionen hier lesen: http://en.wikipedia.org/wiki/C%2B%2B/CLI –

+0

das Caret '^' verhält sich wie das '*' bei der Deklaration eines verwalteter Typ, dh; Std :: Zeichenfolge * str; // Zeiger auf std :: string - kann nulptr sein – user2796283

Antwort

56

gcnew ist für .NET-Referenzobjekte; Objekte, die mit gcnew erstellt wurden, werden automatisch mit dem Müll gesammelt. Es ist wichtig, gcnew mit CLR-Typen zu verwenden.

+0

@ [Chris Jester-Young]: Danke Chris, das ist gut zu wissen, wie man die MS-Links repariert –

+0

Aus Neugier, wie wichtig ist es, 'gcnew' mit CLR zu verwenden Arten? Ist es in Ordnung, einen CLR-Typ statisch zu deklarieren (zB 'System :: String' anstelle von' System :: String^')? Wird sie am Ende ihrer Lebensdauer/ihres Anwendungsbereichs korrekt freigegeben? – jliv902

+0

@ jliv902: Ich bezweifle es - aber ich war eine Weile außerhalb dieser Sphäre! –

35

gcnew ist ein Operator, genau wie der Operator new, außer dass Sie nichts löschen müssen, das damit erstellt wurde. Es ist gc ollected. Sie verwenden gcnew zum Erstellen von verwalteten .Net-Typen und neu zum Erstellen von nicht verwalteten Typen.

+5

upvoted (nicht, dass Sie die Punkte brauchen), weil wir die gleiche Antwort zur gleichen Zeit gepostet haben –

1

Das Caret '^' verhält sich in C/C++ beim Deklarieren eines Typs gleich dem '*';

// 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; 

Ich verwende den Begriff ‚Zeiger‘, wenn das verwaltete Objekt als verwaltete Objekt beschreiben kann ‚nullptr‘ verglichen werden, wie ein Zeiger in C/C++. Eine Referenz in C/C++ kann nicht mit 'nullptr' verglichen werden, da sie die Adresse eines vorhandenen Objekts ist.

Verwaltete Objekte verwenden automatisches Referenzzählen, was bedeutet, dass sie automatisch zerstört werden, wenn sie einen Referenzzähler von Null haben. Wenn jedoch zwei oder mehr unerreichbare Objekte aufeinander verweisen, haben Sie immer noch ein Speicherleck. Seien Sie gewarnt, dass das automatische Referenzzählen nicht kostenlos ist, also verwenden Sie es mit Bedacht.