7
votes

Est-ce une bonne pratique de passer scoped_ptr par référence (d'une méthode à une autre dans une classe)?

ou si j'ai besoin de faire cela, je devrais simplement utiliser Shared_Ptr?


0 commentaires

3 Réponses :


14
votes

Il est sécuritaire de passer scoped_ptr par référence si la callee n'a pas besoin de stocker le pointeur enveloppé et l'utilise simplement pour invoquer certaines méthodes. L'objet gardé par le scoped_ptr sera détruit lorsqu'il est hors de portée - soit à la fin de la fonction d'appel si le pointeur était une variable de pile, ou lorsque l'instance de classe contenant est distribuée, si elle était une variable membre.

En général, les pointeurs intelligents sont là pour gérer Propriété d'objet , alors voici une époque rapide:

  • boost :: scoped_ptr limite la durée de vie de l'objet gardée à la portée enfermante, il n'y a qu'un seul propriétaire.
  • avec std :: auto_ptr Il n'y a aussi qu'un seul propriétaire à la fois, mais permet de transmettre la propriété via une affectation (en tant que paramètre de fonction ou valeur de retour.)
  • boost :: Shared_ptr prend en charge la propriété partagée via le comptage de référence, l'objet gardé n'est détruit que lorsque le nombre de références va à zéro. C'est le pointeur intelligent le plus polyvalent, mais aussi le plus cher, car il subit des frais généraux mineurs (le nombre de références est maintenu avec des opérations atomiques, qui sont plutôt chères.) Il existe également une possibilité de dépendances circulaires.
  • boost :: faible_ptr est un pointeur intelligent non propriétaire , qui pourrait être mis à niveau vers boost :: Shared_ptr au moment de l'exécution avec un chèque que l'objet gardé est toujours en vie.

    Il y a aussi des variantes de tableau tels que boost :: Shared_array Etant donné que C ++ a des fonctions de transaction séparées pour des objets simples et plusieurs objets ( Supprimer contre Opérateur Supprimer [] .)

    Les pointeurs intelligents prennent en charge le L'acquisition de ressources est l'initialisation ou Raii, idiome, qui est un moyen Pour fournir Garanties de sécurité d'exception .



11
votes

Oui, vous pouvez le transmettre par référence.

Toutefois, si la fonction veut simplement utiliser l'objet géré, vous pouvez envisager de transmettre une référence à l'objet lui-même. P>

Object o;
boost::scoped_ptr<Object> scoped(new Object);
boost::shared_ptr<Object> shared(new Object);

foo(o);  //no
foo(scoped); //OK
foo(shared); //no

bar(o);  //OK
bar(*scoped); //OK
bar(*shared); //OK


0 commentaires