Lors du redimensionnement d'un vecteur, il appellera le constructeur puis le détruit.
$./m CAT() CAT(const CAT& c) CAT(const CAT& c) CAT(const CAT& c) CAT(const CAT& c) CAT(const CAT& c) CAT(const CAT& c) ~CAT() ----------------- CAT() //why resize will call constructor? ~CAT() ~CAT() ~CAT() ~CAT() ----------------- ~CAT() ~CAT() ~CAT()
3 Réponses :
Il est possible que votre implémentation de vectorielle :: redimensionne code> crée un objet temporaire par défaut, même lors de la réduction des effectifs, car il l'utilise pour initialiser de nouveaux éléments lorsqu'il se pose. P>
C'est probablement le cas - sinon cela appellerait probablement chat () code> 6 fois au lieu de
chat (const Cat & C) Code> Faire le processus de création. Il est probablement
redimensionner (int x) code> lors de l'exécution du constructeur.
c'est à cause de l'argument facultatif pour C'est la mise en œuvre que j'ai dans GCC 4.8: p> prenez plus près Recherchez-vous à de http : //www.cplusplus.com/reference/vector/vector/resize/ : p> redimensionner code>.
Value_Type __x = value_type () code>. p>
avant C ++ 11, qui explique pourquoi vous voyez un objet supplémentaire Créé et détruit. P> Dans une bibliothèque moderne, il est remplacé par deux surcharges p> de sorte que vous ne devriez pas voir des objets supplémentaires à moins que vous ne fournissez aucun objet supplémentaire à moins que vous ne fournissez pas explicitement une. Vous devriez également voir l'initialisation par défaut, plutôt que la copie-initialisation, pendant la construction. P> P> redimensionner code> avait un deuxième argument par défaut pour fournir une valeur pour initialiser les nouveaux éléments:
Avez-vous une optimisation allumée? Je n'obtiens pas le même résultat que vous dans VS2013.
@MOHAMMEDMAJEED, pas d'optimisation, voici ma commande compile g ++ -wall -o m main.cpp. Utiliser "g ++ -wall -o2 -o m main.cpp" aura le même résultat de mon côté.
@herohuyongtao Il semble y avoir créé un supplément et il devait donc être destructé.
@camino Votre compilateur ou la bibliothèque STD qui vient avec elle semble être buggy. J'ai couru votre code sur Ideone et ça a fonctionné bien. Ideone.com/7GJPBA
Jetez un look ici . Je ne pense pas que ce soit un dupliqué, mais il est proche.
Je reçois la même chose avec GCC-4.8.2 sur OS X 10.9. Cependant, Clang Rendements:
6 x () | 3 x ~ () | 3 x ~ () code>
@Mohammedmajeed pourquoi un extra un?
@ hérohuyongtao Il y a 8 chats () et 8 ~ chat () de pourquoi vérifier les marques réponse
@herohuyongtao sauf que cela ne doit pas - il détruit exactement autant d'éléments que cela construit.
@Brett apparemment clang est buggy. Voir la réponse de Ichramm pour une explication Pourquoi le code doit i> créer ces instances. Voir aussi La documentation .
@KonraDrudolph - Clang fournit à la fois des surcharges. Je ne vois aucun bug.
BITS / stl_vector.h de GCC CODE> Est-ce que cela aussi, si la dialecte C ++ 11 est spécifiée.
@BRETT Ces surcharges doivent exister uniquement b> pour C ++ 11. Avant cela, le compilateur n'a aucun choix, il doit choisir la seule surcharge disponible et qui crée toujours une instance par défaut.
@BreThale c'est le point: op est pas i> à l'aide de C ++ 11, ils utilisent C ++ 98. Et Clang ++ en mode C ++ 98 affiche le comportement C ++ 11. Que est i> un bug (quoique pas très mauvais). Clang, quand appelé comme
clang ++ -std = c ++ 98 test.cpp code> doit créer un exécutable qui produit la même sortie que OP. Ce n'est pas le cas.
@Konradrudolph - Vous avez absolument raison.
clang ++ -std = c ++ 98 code> ne i> n'amère pas l'argument par défaut, tandis que
g ++ code> est la bonne chose pour C ++ 98/03 et C ++ 11 respectivement. Je me suis trompé avec différentes normes / compilateurs.