std::vector::clear() dans le constructeur et le destructeur
Je rencontre de nombreuses fois avec le code où std::vector::clear() de la classe membre de type std::vector est appelée dans le constructeur et le destructeur.
Je ne vois pas pourquoi il est nécessaire:
- constructeur - le membre de la classe de type std::vector est vide par défaut, donc pas besoin d'appeler clear().
- destructeur - le membre de la classe de type std::vector sera détruite dans le cadre de la norme de la destruction de l'objet contnaining. Dans le cadre de vecteur de destruction de tous les des objets de valeur de containied dans il sera détruit (si ce tas de pointeurs alloués à la mémoire, ils doivent être supprimés "manuellement"), donc encore une fois pas besoin d'appeler clear().
Dois-je raté quelque chose?
OriginalL'auteur dimba | 2009-10-19
Vous devez vous connecter pour publier un commentaire.
À partir du son de choses, les personnes qui ont écrit ce code ont été ceux qui ont raté quelque chose. Le seul moment où il serait judicieux d'appeler clear() dans un ctor ou dtor serait au milieu d'un autre code. Par exemple, un ctor peut lire dans certains de données, les traiter, puis de lire davantage de données. Dans un tel cas, il est probablement plus rapide à utiliser qu'un seul conteneur pour les données comme vous le lire, et d'effacer à chaque fois, plutôt que d'en créer un nouveau conteneur de chaque itération.
OriginalL'auteur Jerry Coffin
Non, tu ne perds rien. Je suppose que c'est (inoffensif) le vaudou de la programmation, un peu comme paramètre un pointeur à null après la libération, ou au hasard d'appel repeindre/revalider dans le code de la GUI. Le programmeur se souvient de ce qu'il a contribué avec une sorte de bug dans le passé, et maintenant, il ajoute inutilement "au cas où". Qui sait, peut-être que ça vous aidera. Le vaudou.
Si quoi que ce soit, vous voulez savoir qui vous a supprimé le pointeur de même deux fois. Il est préférable d'échouer fort (et de trouver) qu'accidentellement réussir (masquage d'un bug qui va revenir à vous mordre)
J'aime ce dicton, "mieux vaut échouer fort"
paramètre un pointeur de membre à la valeur NULL dans un dtor, quand il est sur le point de disparaître complètement? Parce que c'est le contexte que nous parlons.
OriginalL'auteur John Kugelman
Considérez ceci :
À l'aide de boost unit_test cadre que j'ai créé 3 cas de test. Le unit_test cadre est grand parce qu'il suit les fuites de mémoire.
Vous remarquerez que le 1er et le 2ème cas de test ne génèrent pas de fuites de mémoire, mais le 3ème cas n'parce que le vecteur de contenu ne sont pas supprimés.
OriginalL'auteur Maciek
Non, vous avez raison. Sauf si il y a plus d'affaires dans le constructeur (ou le constructeur de la classe de base) qui imposent, mais les chances sont très faibles...
Éditer plus tard
En cas de destructeur, l'une des erreurs les plus courantes que j'ai vu, c'est que certaines personnes supposent que clair méthode permet d'appeler delete pour les vecteurs de pointeurs (vecteur), ce qui, bien sûr, il n'est pas le cas
OriginalL'auteur Cătălin Pitiș
Le seul cas que je peux penser de l'endroit où il serait utile est l'endroit où l'ordre de destruction des questions et le destructeur veut s'assurer que les objets dans le vecteur sont détruits avant que quelque chose d'autre.
Bien sûr, il est préférable de structure de code pour ne pas exiger que; toutefois, il est concevable que de raison.
OriginalL'auteur janm
En dépit de ce que dit jusqu'à présent, il y a au moins un scénario où un appel explicite à
clear
dans le destructeur peut être nécessaire.Imaginer la situation lorsque l'objet est détruit a plusieurs membre de la sous-objets, qui exigent l'ordre spécifique de la destruction, c'est à dire les sous-objets en quelque sorte dépendent les uns des autres, et un ordre incorrect de leur destruction doit conduire à des résultats indésirables. Comme vous le savez probablement, l'ordre de membre de la sous-objet de destruction (ainsi que l'initialisation de membre) est déterminé par l'ordre des membres declararion dans la définition de la classe. Donc, d'une façon d'arriver à l'ordre de destruction est d'organiser les déclarations de membre en conséquence. Toutefois, d'abord, ce n'est pas une très bonne solution d'entretien-sage. Deuxièmement, l'ordre souhaité de destruction peut dépendre de certaines conditions d'exécution. Troisièmement, l'ordre souhaité de destruction pourrait contredire l'souhaité complilation de l'initialisation. Cela signifie qu'il pourrait ne pas être possible (ou sage) de commande de l'ordre de la destruction par une réorganisation des déclarations.
Une approche raisonnable dans ce cas, peut-être afin de nettoyer les critiques membre de la sous-objets manuellement, en les appelant par leurs
clean
méthodes ou tel, jusqu'à la destruction dépendance à l'ordre de "disparaît". Je suppose, peut-être que le code que vous avez vu était de tenter de résoudre à la commande de problème en appelantclean
sur un stratégiquement choisivector
sous-objet.Comme pour appeler
clean
dans le constructeur... je n'ai aucune idée de pourquoi quelqu'un ferait quelque chose comme ça.J'ai peut-être tort, mais quand la stl objet est en train de mourir à une extrémité de la portée - par exemple. Il appelle le destructeur de l'objet à l'intérieur. Si ce que ledit objet est également un conteneur stl il devrait disparaître de lui-même automatiquement. Exceptionnelle situation avec un pointeur initié par "nouveau" - comme d'habitude
Personne ne discute pas avec qui. Ce que je dis, encore une fois, que l'ordre de automatique nettoyage pourrait être inacceptable dans certains cas. Dans lequel cas, vous devrez faire votre propre, sur commande, pré-nettoyage avant le nettoyage automatique commence.
OriginalL'auteur AnT
Bien sûr, on doit appeler clear() ou redimensionner(0) ou l'équivalent de dire (std::_Destroy_range(...) dans le destructeur avant de le libérer.
De libération de la mémoire est faite par l'intermédiaire de l'allocateur::désallouer qui ne s'exécutent PAS les destructeurs. Il a juste libère la mémoire.
clear() est équivalent à redimensionner(0) qui exécute des destructeurs sur la première taille() des choses dans la mémoire tampon allouée
PAS seulement affecté les pointeurs, les descripteurs de fichiers, tenue mutex, toutes les autres ressources récupérables détenus par l'objet. Les destructeurs DOIT être exécuté. Avant l'instanciation du modèle ne sait pas que le destructeur est trivial. Si le destructeur est trivial, ALORS c'est optimisée APRÈS l'instanciation
Absolument incorrect.
Je l'ai lu aussi discuter d'un appel clair en ~vecteur() plutôt que de la discussion d'un appel clair sur un vecteur membre de la variable d'instance d'une classe définie par l'utilisateur - mon mal lu.
OriginalL'auteur pgast