auto foo = getSharedPointer().get();
Chaque fois qu'une fonction retourne un type qui n'est pas une référence, le résultat de l'appel de la fonction est un rvalue. En outre, étant donné que la fonction getSharedPointer()
renvoie un type de classe, le résultat est un objet temporaire.
La durée de vie de cet objet temporaire est définie comme la fin de l'évaluation de l'expression la plus externe, ici getSharedPointer().get()
. Dès que la variable foo
est initialisée, le pointeur intelligent propriétaire est détruit; Lorsque le dernier shared_ptr
possédant cet objet est détruit, l'objet est supprimé.
Ici getSharedPointer()
retourne toujours shared_ptr
qui ne partage pas l'objet géré (use_count()
est 1), de sorte que lorsque cette copie de la dernière shared_ptr
est détruite, l'objet est détruit et le pointeur sur l'objet est invalide.
(Je ne sais pas pourquoi vous retournez un shared_ptr
et non un unique_ptr
ici.)
L'utilisation correcte d'un pointeur intelligent, ou toute classe qui « possède » (contrôle la durée de vie) d'autres ressources (ressources auxquelles vous êtes toujours autorisé à accéder directement), est de garder le pointeur/propriétaire "intelligent" en vie aussi longtemps que vous avez besoin d'accéder à la ressource.
Le pointeur "intelligent" (objet propriétaire) doit donc être nommé. Aussi, je ne suis pas sûr que vous voudriez vraiment cacher le fait que c'est un pointeur intelligent de la vue du lecteur avec auto
.
std::shared_pointer<Bar> foo = getSharedPointer();
// use foo.get()
Vous pouvez cacher le type exact d'objet géré:
std::shared_pointer<auto> foo = getSharedPointer();
Vous ne trouvez pas 'getSharedPointer' documentés dans la bibliothèque standard ou tiers communs parties. Aucune idée de ce qui se passe. Recommande d'ajouter un peu plus d'informations. – user4581301