Existe-t-il une raison d’utiliser auto_ptr?

Après avoir lu l’explication de Jossutis sur auto_ptr de son livre STL, j’ai la forte impression que, quelle que soit la tâche à laquelle j’essaierais de l’utiliser, j’échouerais à 100% à cause de l’un des nombreux pièges de auto_ptr.

Ma question est la suivante: existe-t-il des tâches de la vie réelle dans lesquelles auto_ptr est vraiment utile et convient parfaitement?

Clairement, auto_ptr perd contre unique_ptr .

Maintenant, dans un monde «ssortingct C ++ 03 sans boost», j’utilise assez souvent auto_ptr , notamment:

  • Pour les ‘fonctions membres d’usine’ qui renvoient une instance allouée dynamicment d’un type donné: j’aime le fait que l’utilisation de std::auto_ptr dans le type de retour explique que l’object doit être supprimé
  • Dans les fonctions qui allouent un object avant de tenter de l’insérer dans un conteneur par la suite: par exemple, pour release() uniquement si std::map<>::insert renvoie que l’insertion a réussi
  • Dans une procédure de thread qui extrait des éléments d’une file de messages, j’aime bien stocker l’élément pop’ed dans un const std::auto_ptr pour indiquer clairement que le message sera détruit quoi qu’il arrive.

Je dirais que cela peut être utilisé, mais ce n’est pas la meilleure option.

Premièrement, il s’agit d’une question d’année ou moins et auto_ptr est officiellement obsolète. Deuxièmement, il existe une alternative supérieure: unique_ptr . Le Dr Stroustrup a déjà déclaré à propos de unique_ptr :

“Ce que auto_ptr aurait dû être” (mais nous ne pouvions pas écrire en C ++ 98)

Donc, à moins que vous n’ayez pas le choix, auto_ptr n’est pas un bon choix. Principalement, car la plupart des compilateurs C ++ de nos jours implémentent la move semantics et fournissent unique_ptr .

Dans des scénarios simples, lorsque vous devez contrôler temporairement un object alloué par tas, auto_ptr peut être utilisé sans problème. Par exemple, si vous devez créer de manière conditionnelle un object qui sera utilisé dans une seule fonction, vous ne pouvez pas l’allouer sur une stack et auto_ptr vous permet de ne pas vous soucier de la durée de vie de l’object en cas d’exception.

J’utilise std::auto_ptr modération, pour garantir la sécurité des exceptions. Autrement dit, pour éviter une fuite de mémoire dans le cas où une partie de la méthode lève une exception.

Par exemple:

 Foo &Container::addFoo( const std::ssortingng &name ) { // The post conditions of the method require that the new Foo // has been added to this container, but the addition method // may throw exceptiona std::auto_ptr< Foo > foo(new Foo(name)); foo->twiddle();// may throw this->addFoo(*foo);// record reference. May throw return *foo.release(); } 

Edited: a précisé que this->addFoo(*foo) enregistre une référence.