Quelle est la bonne manière de libérer un vecteur std :: de pointeurs en C ++?
J'ai cherché sur StackOverflow, mais ne pouvait pas trouver la réponse à cette question.
Supposons que j'ai un std::vector<Day *> vector_day
- c'est - un vecteur de pointeurs sur des Day
objet. Maintenant, je push_back
à vector_day
de nombreux éléments:
vector_day.push_back(new Day(12));
vector_day.push_back(new Day(99));
vector_day.push_back(new Day(71));
...
Maintenant à un certain point, je n'ai plus besoin vector_day
. Quelle est la bonne façon de libérer la mémoire?
Il ce la bonne façon:
for (std::vector<Day *>::iterator i = vector_day.begin(); i != vector_day.end(); ++i) {
delete *i;
}
N'est-ce pas invalider le vecteur pour chaque suppression? Je suis très confus.
source d'informationauteur bodacydo
Vous devez vous connecter pour publier un commentaire.
Le meilleur moyen est de ne pas mettre les pointeurs dans le vecteur, en premier lieu, si vous n'avez pas absolument besoin de.
Mais si vous ne vraiment besoin d'avoir un vecteur de pointeurs, puis de la façon dont vous le faites est très bien (mais
.clear()
le vecteur par la suite, si elle ne peut pas être immédiatement détruit, de sorte qu'il n'est pas plein de pendre des pointeurs)La déclaration
n'a aucun effet sur l'itérateur. Il ne modifie pas l'itérateur, la nullité de l'itérateur, ou supprimer le pointeur de visée par l'itérateur de la collection. Il n'est de libérer de la mémoire, que le pointeur de visée par l'itérateur points. Le pointeur lui-même doit être retirée de la collection séparément.
Boost ptr_vector à la rescousse!
Fait exactement ce dont vous avez besoin, sans avoir à parcourir et supprimer le contenu de la std::vector
Un autre C++ façon de le faire est de définir une aide struct:
et ensuite utiliser les algorithmes:
En général en C++, vous devez cacher la gestion de la mémoire, autant que possible, afin d'éviter les erreurs de mémoire. Sauf si vous êtes en train de faire beaucoup de copier des pointeurs et des soins de beaucoup sur les performances, je voudrais juste utiliser un shared_ptr.
Il fait partie de la TR1 standard et est disponible dans la plupart des modernes compilateurs C++ de la boîte (http://anteru.net/2008/09/01/260/) et est idéal pour le feu et oublier la gestion de la mémoire.
Vous devriez probablement utiliser une sorte de géré pointeur, le plus probable d'un pointeur partagé.
Si vous supprimez le vecteur tandis que quelqu'un d'autre est toujours tenue à l'un de ces pointeurs, vous allez obtenir quelques très méchant comportement s'ils essaient de les déréférencer. Un pointeur partagé permettra d'économiser vous que les maux de tête.
Si vous pouvez garantir que rien d'autre ne référence les pointeurs après le vecteur est supprimé, vous pouvez encore bénéficier de l'aide d'un pointeur automatique. Il faudra gérer de libération de la mémoire pour vous lorsque le vecteur est détruit. La surcharge est minime, et il rend votre vie beaucoup plus facile.
Opérations d'ajouter ou de supprimer des éléments de la matrice peut invalider les itérateurs, consultez la documentation de règles spécifiques pour les différents types de conteneurs. Avec
delete
vous agissez sur les données contenues dans les éléments du tableau, et non pas sur le tableau de la forme. Les itérateurs traverse le récipient de forme, ils ne se soucient pas de son contenu.Tout d'abord, vous avez changé de
i
àit
mais je suppose que c'est juste une faute de frappe.Mais pour répondre à votre quête, non, c'est bien. Vous n'êtes pas changer
it
vous sont en train de changer*it
.C'est juste bien. Vous êtes à la suppression de
*i
(objet pointé par le vecteur de l'élément) et de ne pasi
(vecteur de l'élément), de sorte que le vecteur n'est pas invalidé.Voir cette question pour un cas où le développeur voulait aussi supprimer tous les
i
s, et pour la solution (vector_day.clear()
) après la boucle.Voici une pratique de classe, j'ai écrit tout à l'heure tout en traitant de la même question. J'ai été la conversion d'une partie du code de la vieille RogueWave basés sur des vecteurs et des listes jusqu'à la STL en fonction des vecteurs et des listes, et avaient besoin d'un moyen d'émuler RW clearAndDestroy() la méthode de pointeur listes. Le clearAndDestroy() la méthode peut être remplacée pour traiter les différents types de structure (je n'inclus vecteur ici par souci de concision).
Une autre façon d'itération + suppression est par l'utilisation de
while(!empty)
boucle.L'avantage de cette technique est qu'un élément est retiré du récipient premier, supprimé par la suite. C'est sûr, pour les tout conteneur: