Pourquoi est-ce mal d'utiliser std::auto_ptr<>
avec des conteneurs standard?
Réponses
Trop de publicités?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.
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.
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.