10
votes

Comportement étrange lors du redimensionnement du conteneur

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()


14 commentaires

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 ~ ()


@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 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 Est-ce que cela aussi, si la dialecte C ++ 11 est spécifiée.


@BRETT Ces surcharges doivent exister uniquement 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 à l'aide de C ++ 11, ils utilisent C ++ 98. Et Clang ++ en mode C ++ 98 affiche le comportement C ++ 11. Que est un bug (quoique pas très mauvais). Clang, quand appelé comme clang ++ -std = c ++ 98 test.cpp 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 ne n'amère pas l'argument par défaut, tandis que g ++ est la bonne chose pour C ++ 98/03 et C ++ 11 respectivement. Je me suis trompé avec différentes normes / compilateurs.


3 Réponses :


3
votes

Il est possible que votre implémentation de vectorielle :: redimensionne 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.


1 commentaires

C'est probablement le cas - sinon cela appellerait probablement chat () 6 fois au lieu de chat (const Cat & C) Faire le processus de création. Il est probablement redimensionner (int x) lors de l'exécution du constructeur.



6
votes

c'est à cause de l'argument facultatif pour redimensionner .

C'est la mise en œuvre que j'ai dans GCC 4.8: xxx

prenez plus près Recherchez-vous à Value_Type __x = value_type () .

de http : //www.cplusplus.com/reference/vector/vector/resize/ : xxx


0 commentaires

5
votes

avant C ++ 11, redimensionner avait un deuxième argument par défaut pour fournir une valeur pour initialiser les nouveaux éléments: xxx

qui explique pourquoi vous voyez un objet supplémentaire Créé et détruit.

Dans une bibliothèque moderne, il est remplacé par deux surcharges xxx

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.


0 commentaires