Domanda
Mi sono imbattuto in questo codice e sono troppo orgoglioso di andare a chiedere all'autore cosa significa.
Hashtable^ tempHash = gcnew Hashtable(iterators_);
IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();
Che cos'è gcnew
e quanto è importante utilizzarlo anziché semplicemente nuovo
? (Sono anche sconcertato dal cursore; ho chiesto di qui ).
Soluzione
gcnew è per oggetti di riferimento .NET; gli oggetti creati con gcnew vengono automaticamente raccolti nell'immondizia; è importante usare gcnew con i tipi CLR
Altri suggerimenti
gcnew
è un operatore, proprio come l'operatore new
, tranne per il fatto che non è necessario eliminare nulla creato con esso. È g arbage c raccolto. Si utilizza gcnew per la creazione di tipi gestiti .Net e new per la creazione di tipi non gestiti.
Il cursore '^' agisce in modo simile al '*' in C / C ++ quando dichiara un tipo;
// 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;
Uso il termine "puntatore" quando descrivo l'oggetto gestito come un oggetto gestito può essere paragonato a "nullptr" proprio come un puntatore in C / C ++. Un riferimento in C / C ++ non può essere paragonato a "nullptr" poiché è l'indirizzo di un oggetto esistente.
Gli oggetti gestiti usano il conteggio dei riferimenti automatici, il che significa che vengono distrutti automaticamente quando hanno un conteggio di riferimento pari a zero anche se se due o più oggetti non raggiungibili si riferiscono a vicenda, si avrà comunque una perdita di memoria. Tieni presente che il conteggio automatico dei riferimenti non è una prestazione gratuita, quindi usalo con saggezza.