2008-12-25 6 views
3

Supposons que j'ai créé une liste liée. Il a son propre destructeur, ce qui libère la mémoire. Cette liste liée ne surcharge pas de nouveau ou ne supprime pas.A propos des constructeurs/destructeurs et des opérateurs nouveaux/supprimés en C++ pour les objets personnalisés

Maintenant, j'essaye de créer un tableau desdites listes liées (hachage ouvert, si je comprends bien). Ensuite, j'alloue la mémoire nécessaire dans le constructeur de cette classe de hachage ouverte. Le nouvel opérateur appelé dans le constructeur est suffisant pour allouer correctement la mémoire pour le tableau, n'est-ce pas? Je ne suis pas sûr parce que je n'ai pas surchargé pour la classe Linked List.

Aussi, en supposant que mon tableau de Listes Liées est appelé des éléments, pourrais-je simplement écrire "delete [] elements" dans le destructeur? Est-ce que cela appelle le destructeur pour chaque élément du tableau et libère correctement la mémoire? Enfin, si mes deux suppositions sont correctes (ie, je n'ai pas besoin de surcharger new et supprimer pour les utiliser avec ma classe personnalisée), à ​​quoi ça sert de surcharger de tels opérateurs?

+0

Si vous devez utiliser une nouvelle utilisation 'shared_ptr' ou' unique_prt'. les deux ont été introduits dans C++ 11 STL . pointeurs partagés fera la tenue de livres de supprimer automatiquement. note pour les tableaux par défaut Deleter fourni par 'appels shared_ptr' supprimer, ne pas supprimer [] donc utiliser les fonctions lambda ' std :: shared_ptr p (new int [10], [] (int * p) { supprimer [] p; }); ' ou ' std :: shared_ptr p (new int [10], std :: default_delete ()); ' ou à l'aide aide fournie par unique_ptr qui appelle de suppression [] 'std :: unique_ptr p (nouveau int [10], [] (int * p) { delete [] p; }); – katta

Répondre

6

Oui, vous avez raison. Un simple

elements = new LinkedList[N]; 

est suffisant pour les allouer. Vous pouvez alors y accéder

elements[i]->push(....); 

et les supprimer dans votre destructor en utilisant la façon dont vous montriez:

delete[] elements; 

Le compilateur se souviendra combien d'éléments ont été attribués, et appelez le destructor pour chaque liste correctement. Le point de surcharge de l'opérateur new and delete est de fournir une stratégie d'allocation de mémoire personnalisée. Par exemple, vous pouvez préallouer de la mémoire, puis extraire de ce pool au lieu d'allouer de nouveau de la mémoire à partir du système d'exploitation.

Mais notez que vous devez aussi écrire un constructeur de copie et un opérateur d'affectation de copie. Puisque si quelqu'un copie votre carte de hachage, la liste liée doit être copiée aussi, et pas seulement le pointeur. Ou vous pouvez faire le constructeur de copie et de copie opérateur d'affectation privée et ne les définit pas, des copies de votre interdisant carte de hachage:

.... 
private: 
    MyHashMap(MyHashMap const& rhs); 
    MyHashMap & operator=(MyHashMap const& rhs); 
.... 
+0

un petit nitpick: La plupart des appels à nouveau n'impliquent pas le système d'exploitation. En règle générale, le système d'exploitation n'est impliqué que lorsque le tas a besoin de saisir plus de pages de mémoire virtuelle. –

1

Toutes vos hypothèses sont correctes.

Il y a beaucoup d'utilisations pour surcharger le nouveau et supprimer, mais ce n'est pas fait souvent. Une raison courante est le suivi des allocations de mémoire afin de détecter les fuites de mémoire. Beaucoup de compilateurs de fuite de temps de compilation le font, mais sont devenus obsolètes avec de meilleures applications externes comme valgrind. Vous pouvez également faire des choses comme utiliser la mémoire mise en commun.

2

L'opérateur nouvel fait deux choses: allouer de la mémoire et appeler le constructeur.

L'opérateur de suppression appelle le destructeur, puis libère la mémoire.

Les tableaux créés avec nouveau [] doivent être détruits avec supprimer [].

En général, vous n'avez pas besoin de surcharger nouveau ou supprimer sauf pour des raisons de performance.Vous pourriez avoir un modèle prévisible d'allocation/désallocation qui rend une stratégie d'allocation particulière très appropriée (utilisation rapide ou faible de la mémoire).

Vous pouvez jeter un oeil à this page.

Questions connexes