210 votes

Pourquoi est-ce mal d'utiliser std::auto_ptr<> avec des conteneurs standard?

Pourquoi est-ce mal d'utiliser std::auto_ptr<> avec des conteneurs standard?

124voto

Kevin Points 7334

La Norme C++ est dit qu'un STL élément doit être "exemplaire constructible" et "assignable." En d'autres termes, un élément doit pouvoir être attribué ou copiés et les deux éléments sont logiquement indépendants. std::auto_ptr ne remplit pas cette condition.

Prenez par exemple ce code:

class X
{
};

std::vector<std::auto_ptr<X> > vecX;
vecX.push_back(new X);

std::auto_ptr<X> pX = vecX[0];  // vecX[0] is assigned NULL.

Pour surmonter cette limitation, vous devez utiliser l' std::unique_ptr, std::shared_ptr ou std::weak_ptr des pointeurs intelligents ou le coup de pouce équivalents si vous n'avez pas de C++11. Ici est le coup de pouce de la bibliothèque de documentation pour ces pointeurs intelligents.

65voto

Frank Krueger Points 27508

La sémantique de copie d' auto_ptr ne sont pas compatibles avec les contenants.

Plus précisément, la copie d'un auto_ptr à un autre ne pas créer deux objets égaux puisque l'on a perdu de sa participation dans le pointeur.

Plus précisément, la copie d'un auto_ptr provoque l'un des exemplaires de laisser aller le pointeur. Lequel de ces vestiges dans le conteneur n'est pas défini. Par conséquent, vous pouvez au hasard de perdre l'accès à des pointeurs si vous stockez auto_ptrs dans les conteneurs.

38voto

Lazer Points 15696

17voto

Garth Gilmour Points 5219

Les conteneurs STL besoin pour être en mesure de copier les articles que vous stocker en eux, et sont conçus pour attendre l'original et la copie sont équivalentes. pointeur automatique des objets ont un tout autre contrat, en vertu de laquelle la copie crée un transfert de propriété. Cela signifie que les contenants de auto_ptr va comportement étrange, selon l'usage.

Il y a une description détaillée de ce qui peut aller mal dans l'efficacité de la STL (Scott Meyers) l'article 8 et aussi un pas-si-description détaillée Effective C++ (Scott Meyers) article 13.

12voto

Dustin Getz Points 8514

Des conteneurs STL stocker des copies des éléments contenus. Lorsqu'un auto_ptr est copié, il définit l'ancien pointeur à null. De nombreux conteneur méthodes sont brisés par ce comportement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X