Pourquoi est-auto_ptr être obsolète?
J'ai entendu auto_ptr
est déprécié en C++11. Quelle est la raison?
Aussi je voudrais savoir la différence entre auto_ptr
et shared_ptr
.
- Double Possible de auto_ptr Est obsolète?
Vous devez vous connecter pour publier un commentaire.
Le remplacement direct pour
auto_ptr
(ou la chose la plus proche à un de toute façon) estunique_ptr
. Aussi loin que le "problème" va, c'est assez simple:auto_ptr
transferts de propriété lorsqu'il vous est assigné.unique_ptr
également les transferts de propriété, mais grâce à la codification de la sémantique de déplacement et la magie de références rvalue, il peut faire beaucoup plus naturellement. Il a également "s'adapte" avec le reste de la bibliothèque standard beaucoup mieux (même si, en toute équité, une partie de l'est grâce au reste de la bibliothèque, à modifier la sémantique de déplacement au lieu de toujours exiger la copie).Le changement de nom est aussi (OMI) bienvenue --
auto_ptr
n'a pas vraiment vous en dire beaucoup sur ce qu'il tente d'automatiser, alors queunique_ptr
est assez raisonnable (si laconique) description de ce qui est fourni.auto_ptr
nom: auto suggère automatique comme en mode automatique variable, et il se réfère à une chose queauto_ptr
faire: détruire la ressource gérée dans son destructeur (quand elle est hors de portée).auto_ptr
: open-std.org/jtc1/sc22/wg21/docs/papers/2005/...unique_ptr
. Au lieu de cela il a été re-spécifié de ne jamais copier. Doncauto_ptr
en fait t travailler avec le modernesort
. Mais le C++98/03sort
est juste un exemple de l'algorithme ici: Aucun algorithme générique (std fourni ou écrites par l'utilisateur) qui suppose que copier la syntaxe est la sémantique de copie aura probablement une erreur d'exécution si elle est utilisée avecauto_ptr
, parce queauto_ptr
silencieusement coups avec copier syntaxe. La question est de beaucoup plus grand que celuisort
.J'ai trouvé les réponses existantes grande, mais à partir de la PoV des pointeurs. OMI, une réponse idéale devrait avoir à l'utilisateur/au point de vue du programmeur réponse.
Première chose d'abord (comme indiqué par Jerry Cercueil dans sa réponse)
shared_ptr : Si vous êtes inquiet au sujet de la libération des ressources de la mémoire ET si vous avez plus d'une fonction qui pourrait être à l'aide de l'objet À DIFFÉRENTS moments, puis aller avec shared_ptr.
Par les DIFFÉRENTES Fois, pensez à une situation où l'objet-ptr est stocké dans de multiples structures de données et, plus tard, accessible. Plusieurs threads, bien sûr, est un autre exemple.
unique_ptr : Si vous êtes préoccupé est la libération de la mémoire et de l'accès à l'objet est SÉQUENTIEL, puis aller pour unique_ptr.
Par SÉQUENTIEL, je veux dire, à n'importe quel point de l'objet sera accessible à partir d'un contexte. E. g. un objet qui a été créé et utilisé immédiatement après la création par le créateur. Après la création de l'objet est stocké dans PREMIÈRE de la structure des données. Ensuite, l'objet est détruit après CELUI de la structure des données ou est déplacé à DEUXIÈME de la structure des données.
À partir de cette ligne, je vais vous partagé/unique _ptr que smart-pointeurs. (auto_ptr est aussi intelligent-pointeur, MAIS en raison de lacunes dans son design,pour lequel ils sont obsolètes, et qui, je pense, je reviendrai dans les prochaines lignes, ils ne devraient pas être regroupés avec les smart-pointeur. )
À partir du lien : http://www.cplusplus.com/reference/memory/unique_ptr/operator=/
Nature du travail pris en charge par unqiue_ptr
À partir de : http://www.cplusplus.com/reference/memory/auto_ptr/operator=/
Nature du travail pris en charge par auto_ptr
Maintenant à la raison pour laquelle la copie de l'assignation lui-même était tellement détesté, j'ai cette théorie :
Le comportement involontaire est vraiment détesté et donc de l'aversion pour le auto_ptr.
(Pour le 3.1415926536% de programmeurs qui, intentionnellement veut transférer la propriété de C++11 leur a donné std::move(), qui fait part de leur intention de cristal clair pour tous les stagiaires qui vont les lire et de maintenir le code.)
auto_ptr
valeurs pointant vers le même objet (puisqu'ils ne donnent pas le partage de la propriété, le premier à mourir laissez les autres avec une mortelle du patrimoine; cela est vrai aussi pourunique_ptr
utilisation) , pouvez-vous suggérer des ce qui a été destiné à ceux qui restent 96.8584073465% de l'ensemble de l'usage?*a=*b;
Ici que la valeur de b est copié dans un. J'Espère que la Propriété de a et de b est toujours avec les mêmes personnes. Vous avez mentionné comme owenership seront transférés. Comment ça va être?auto_ptr
objet lui-même. L'attribution à son pointu de valeur n'a aucun effet sur, ni la pertinence, la possession. J'espère que vous n'êtes pas encore à l'aide deauto_ptr
?auto_ptr
une fois qu'il est à l'intérieur d'un conteneurshared_ptr
peuvent être stockés dans des conteneurs.auto_ptr
ne le peuvent pas.BTW
unique_ptr
est vraiment le directauto_ptr
de remplacement, il combine les meilleures caractéristiques des deuxstd::auto_ptr
etboost::scoped_ptr
.Encore une autre de prendre sur l'explication de la différence....
Fonctionnellement, C++11 est
std::unique_ptr
est "fixe"std::auto_ptr
: deux d'entre eux sont adaptés lors de l' - à tout moment au cours de l'exécution - il devrait y avoir un seul smart pointeur de la propriétaire d'un pointu à l'objet.La différence essentielle est dans la copie de la construction ou de la cession de l'onu-qui expire le pointeur intelligent, indiqué sur la
=>
lignes ci-dessous:Ci-dessus,
ap3
tranquillement "vole" le droit de propriété*ap
, laissantap
ensemble à unnullptr
, et le problème est qu'il peut arriver, trop facilement, sans que le programmeur avait pensé à sa sécurité.Par exemple, si un
class
/struct
a unstd::auto_ptr
membre, puis de faire une copie d'une instancerelease
le pointeur de l'instance en cours de copie: c'est bizarre et dangereuse confusion sémantique comme d'habitude de copier quelque chose ne la modifiez pas. Il est facile pour les class/struct auteur de négliger la libération du pointeur lorsque raisonnement sur les invariants et de l'état, et, par conséquent, accidentellement tentative de déréférencer les smart-pointeur pendant null, ou tout simplement ne pas encore avoir attendu d'accès de la propriété de la pointe-aux données.auto_ptr ne peut pas être utilisé dans des conteneurs STL parce qu'il a un constructeur de copie qui ne répondent pas aux exigences de conteneur CopyConstructible. unique_ptr ne pas mettre en œuvre un constructeur de copie, afin de conteneurs d'utiliser d'autres méthodes. unique_ptr peut être utilisé dans des conteneurs et est plus rapide pour les mst algorithmes de shared_ptr.