Avec l'arrivée du nouveau standard (et des pièces déjà disponibles dans certains compilateurs), le nouveau type std::unique_ptr
est censé remplacer std::auto_ptr
.
Leur utilisation se chevauche-t-elle exactement (pour que je puisse faire une recherche / remplacement globale sur mon code (non pas que je le ferais, mais si je le faisais)) ou devrais-je être conscient de certaines différences qui ne sont pas apparentes à la lecture de la documentation?
Aussi, s'il s'agit d'un remplacement direct, pourquoi lui donner un nouveau nom plutôt que simplement améliorer le std::auto_ptr
?
la source
std::auto_ptr
etstd::unique_ptr
sont incompatibles dans certains cas et une baisse de remplacement dans d'autres. Donc, aucune recherche / remplacement ne suffit pas. Cependant, après une recherche / remplacement, les erreurs de compilation devraient tout corriger, sauf les cas de coin étranges. La plupart des erreurs de compilation nécessiteront l'ajout d'un fichierstd::move
.100% compatible, tant que vous ne la transmettez pas par valeur à une autre fonction.
pas 100% compatible mais 99% compatible ne semble pas faux.
100% compatible avec une mise en garde,
unique_ptr
s doit être passé via unstd::move
appel. Celui-ci est simple car le compilateur se plaindra si vous ne le faites pas correctement.100% compatible.
celle-ci est délicate.
std::auto_ptr
La sémantique de la copie est mauvaise. Si la classe n'autorise pas la copie,std::unique_ptr
c'est une baisse de remplacement. Cependant, si vous essayez de donner à la classe une sémantique de copie raisonnable, vous devrez changer lestd::auto_ptr
code de gestion. C'est simple car le compilateur se plaindra si vous ne faites pas les choses correctement. Si vous avez autorisé la copie d'une classe avec unstd::auto_ptr
membre sans code spécial, alors honte à vous et bonne chance.En résumé,
std::unique_ptr
c'est un ininterrompustd::auto_ptr
. Il interdit au moment de la compilation les comportements qui étaient souvent des erreurs lors de l'utilisation d'un fichierstd::auto_ptr
. Donc, si vous avez utiliséstd::auto_ptr
avec le soin dont vous avez besoin, passer àstd::unique_ptr
devrait être simple. Si vous vous êtes appuyé surstd::auto_ptr
le comportement étrange de 's, vous devez de toute façon refactoriser votre code.la source
AFAIK,
unique_ptr
n'est pas un remplacement direct. Le principal défaut qu'il corrige est le transfert implicite de propriété.std::auto_ptr<int> a(new int(10)), b; b = a; //implicitly transfers ownership std::unique_ptr<int> a(new int(10)), b; b = std::move(a); //ownership must be transferred explicitly
D'autre part,
unique_ptr
aura des capacités complètement nouvelles: ils peuvent être stockés dans des conteneurs.la source
auto_ptr
ne sont pas autorisés.Herb Sutter a une belle explication sur GotW # 89 :
En d'autres termes, même si une recherche et un remplacement globaux peuvent "casser" votre code temporairement, vous devriez le faire quand même: cela peut prendre un certain temps pour corriger les erreurs de compilation, mais vous évitera beaucoup plus de problèmes à long terme.
la source