Qu’est-ce que gcnew?

Je suis tombé sur ce code et je suis trop fier d’aller demander à l’auteur ce que cela signifie.

Hashtable^ tempHash = gcnew Hashtable(iterators_); IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator(); 

Qu’est-ce que gcnew et à quel point est-il important de l’utiliser plutôt que simplement new ? (Je suis également déconcerté par le caret; j’ai demandé à ce sujet ici .)

gcnew est pour les objects de référence .NET; les objects créés avec gcnew sont automatiquement récupérés; il est important d’utiliser gcnew avec les types CLR

gcnew est un opérateur, tout comme le new opérateur, sauf que vous n’avez pas à supprimer de gcnew . C’est g arbage détecté. Vous utilisez gcnew pour créer des types gérés par .Net et pour créer des types non gérés.

Le caret ‘^’ agit de la même manière que le ‘*’ en C / C ++ lorsqu’il déclare un type;

 // pointer to new std::ssortingng object -> memory is not garbage-collected std::ssortingng* strPtr = new std::ssortingng; // pointer to System::Ssortingng object -> memory is garbage-collected System::Ssortingng^ manStr = gcnew System::Ssortingng; 

J’utilise le terme “pointeur” pour décrire l’object géré comme un object géré peut être comparé à “nullptr”, tout comme un pointeur en C / C ++. Une référence en C / C ++ ne peut pas être comparée à «nullptr» car c’est l’adresse d’un object existant.

Les objects gérés utilisent le comptage automatique des références, ce qui signifie qu’ils sont automatiquement détruits lorsqu’ils ont un compteur de référence égal à zéro, mais si deux objects inaccessibles se réfèrent l’un à l’autre, vous aurez toujours une fuite de mémoire. Soyez averti que le comptage automatique des références n’est pas une performance gratuite, donc utilisez-le judicieusement.