Quand souhaitez-vous utiliser un std::auto_ptr au lieu de boost::shared_ptr?
Nous avons assez bien déplacé à l'aide de boost::shared_ptr
dans l'ensemble de notre code, nous avons cependant encore quelques cas isolés où nous utilisons std::auto_ptr
, y compris les classes singleton:
template < typename TYPE >
class SharedSingleton
{
public:
static TYPE& Instance()
{
if (_ptrInstance.get() == NULL)
_ptrInstance.reset(new TYPE);
return *_ptrInstance;
}
protected:
SharedSingleton() {};
private:
static std::auto_ptr < TYPE > _ptrInstance;
};
J'ai dit qu'il y a une très bonne raison pour laquelle cela n'a pas été fait shared_ptr
, mais pour la vie de moi je ne comprends pas pourquoi? Je sais que auto_ptr
finira par être marqué comme déprécié dans le prochain standard, donc j'aimerais sais quoi/comment je peux remplacer cette mise en œuvre.
Aussi, existe-il d'autres raisons pour lesquelles vous devez envisager d'utiliser un auto_ptr
au lieu d'un shared_ptr
? Et voyez-vous des problèmes pour le déplacement à shared_ptr dans l'avenir?
Edit:
- Donc, en réponse à la question "puis-je remplacer en toute sécurité
auto_ptr
avecshared_ptr
dans le code ci-dessus", la réponse est oui, mais je vais prendre un petit gain de performance. - Quand
auto_ptr
est finalement marqué comme déprécié et nous nous déplaçons surstd::shared_ptr
, nous aurons besoin de tester notre code pour faire en sorte que nous sommes en respectant les différentes sémantique de propriété.
- auto_ptr est remplacé, en raison surtout de la façon de traiter avec la sémantique de déplacement, que le maintien de la compatibilité ascendante est plus propre que de le mettre à jour, dans ce cas. La nouvelle classe doit *croise les doigts* être presque une baisse-dans le remplacement, si.
Vous devez vous connecter pour publier un commentaire.
auto_ptr
etshared_ptr
résoudre entièrement les problèmes. L'un ne remplace pas l'autre.auto_ptr
est une mince wrapper autour de pointeurs pour mettre en œuvre RAII de la sémantique, de sorte que les ressources sont toujours relâchés, même face à des exceptions.auto_ptr
n'effectue pas de comptage de référence ou à tous les, il ne fait pas plusieurs pointeurs pointent vers le même objet lors de la création de copies. En fait, c'est très différent.auto_ptr
est l'une des rares classes où l'opérateur d'affectation modifie le source de l'objet. Considérez ceci sans vergogne fiche de la auto_ptr page wikipedia:Remarque comment l'exécution de
modifie non seulement y mais aussi x.
La
boost::shared_ptr
modèle permet de gérer plusieurs pointeurs vers le même objet, et l'objet n'est supprimé après la dernière référence à il est allé hors de portée. Cette fonctionnalité n'est pas utile dans votre scénario, qui (tente de) mettre en œuvre un Singleton. Dans votre scénario, il y a toujours 0 références 1 de référence pour le seul objet de la classe, le cas échéant.En essence,
auto_ptr
objets etshared_ptr
objets totalement différents de la sémantique (c'est pourquoi vous ne pouvez pas utiliser l'ancienne dans des conteneurs, mais de le faire avec le dernier est très bien), et j'espère bien que vous avez de bons tests pour attraper toutes les régressions vous avez mis en place lors de portage de votre code. :- }D'autres ont répondu pourquoi ce code utilise une
auto_ptr
au lieu d'unshared_ptr
. Pour répondre à vos autres questions:Quoi/comment je peux remplacer cette mise en œuvre?
Utiliser
boost::scoped_ptr
ouunique_ptr
(disponible en Boost et la nouvelle norme C++). Les deuxscoped_ptr
etunique_ptr
fournir stricte de la propriété (et pas de comptage de référence généraux), andthey éviter le surprenant supprimer-sur-la sémantique de copie deauto_ptr
.Aussi, existe-il d'autres raisons pour lesquelles vous devez envisager d'utiliser un
auto_ptr
au lieu d'unshared_ptr
? Et voyez-vous des problèmes pour le déplacement àshared_ptr
dans l'avenir?Personnellement, je ne voudrais pas utiliser un
auto_ptr
. Supprimer-sur-copie est tout simplement trop non intuitive. Herb Sutter semble d'accord. Commutation descoped_ptr
,unique_ptr
, oushared_ptr
devrait offrir pas de problèmes. Plus précisément,shared_ptr
devrait être une baisse-dans le remplacement si vous n'avez pas de soins sur le comptage de référence généraux.scoped_ptr
est un remplacement si vous n'utilisez pasauto_ptr
's de transfert de propriété des capacités. Si vous êtes à l'aide de transfert de propriété, puisunique_ptr
est presque une baisse-dans le remplacement, sauf que vous devez à la place d'appeler explicitementmove
de transfert de propriété. Voir ici pour un exemple.auto_ptr est le seul type de pointeur intelligent que j'utilise. Je l'utilise car je n'utilise pas de coup de pouce, et parce que je préfère en général mon entreprise/de l'application des classes orientées explicitement
définir la suppression de la sémantique et de l'ordre, plutôt que de dépendre de
les collections de la, ou des, des pointeurs intelligents.