ou si j'ai besoin de faire cela, je devrais simplement utiliser Shared_Ptr? P>
3 Réponses :
Il est sécuritaire de passer En général, les pointeurs intelligents sont là pour gérer Propriété d'objet forte>, alors voici une époque rapide: p>
Il y a aussi des variantes de tableau tels que 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 . P> scoped_ptr code> 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 code> 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. p>
boost :: scoped_ptr code> limite la durée de vie de l'objet gardée à la portée enfermante, il n'y a qu'un seul propriétaire.
std :: auto_ptr code> 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 code> 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 code> est un pointeur intelligent non propriétaire i>, qui pourrait être mis à niveau vers
boost :: Shared_ptr code> au moment de l'exécution avec un chèque que l'objet gardé est toujours en vie.
ul>
boost :: Shared_array code> Etant donné que C ++ a des fonctions de transaction séparées pour des objets simples et plusieurs objets (
Supprimer code> contre
Opérateur Supprimer [] code>.) p>
Pensez-vous qu'il est correct de passer le pointeur lui-même à l'autre méthode? Je veux dire: Si dans F1, j'ai alloué partagé_ptr A (nouveau A ()), est-ce une bonne pratique à faire: F2 (A.get ()). Bien sûr, F2 reçoit un pointeur à un ici.
Event meilleur - Passez une référence [const]: F2 (* a); code>.
Je veux dire t & opérateur * () const; code> de
scoped_ptr code>.
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
Personnellement, je passe partagée_ptr par const Référence presque partout. Comme d'autres l'ont dit, si vous appelez une fonction et en passant une référence de const, l'appelant va presque certainement garder la portée partagée_ptr. p>
Le véritable avantage est que vous enregistrez le coût de la mise à jour du compteur de référence de cette manière. Une lecture rapide du wiki http://fr.wikipedia.org/wiki/reference_counting et vous "LL Apprendre que les opérations d'exécution constamment +1 / -1 (probablement atomique) sur le compteur de référence peuvent ravager votre cache. p>