J'ai un objet qui est apparemment supprimé en double malgré le fait qu'il soit suivi par des pointeurs intelligents. Je suis nouveau à l'aide de pointeurs intelligents, donc j'ai fait une fonction simple pour tester si j'utilise l'objet correctement. Cet ensemble de lignes dans la fonction principale provoque une erreur d'exécution lorsque les pointeurs sortent du champ d'application, pourquoi? Les pointeurs intelligents ne sont-ils pas supposés être capables de gérer la suppression d'un par eux-mêmes?pointeur partagé double suppression
Répondre
Utilisation correcte est:
std::shared_ptr<int> b = std::make_shared<int>(2);
std::shared_ptr<int> c = b;
A shared_ptr
à propre attend l'objet pointé à.
Ce que vous avez fait est de créer deux pointeurs intelligents distincts, dont chacun pense avoir la propriété exclusive du sous-jacent int
. Ils ne connaissent pas l'existence de l'autre, ils ne se parlent pas. Par conséquent, quand ils sortent de la portée, les deux pointeurs suppriment la ressource sous-jacente, avec le résultat évident. Lorsque vous créez un shared_ptr
, il crée une sorte d '"objet de gestion" responsable de la durée de vie de la ressource. Lorsque vous copiez un shared_ptr
, les deux copies référencent le même objet de gestion. L'objet de gestion conserve la trace du nombre d'instances shared_ptr
pointant sur cette ressource. Un int*
en lui-même n'a pas un tel "objet de gestion", donc le copier ne garde pas de trace des références.
est ici une réécriture minimale de votre code:
// incidentally, "make_shared" is the best way to do this, but I'll leave your
// original code intact for now.
int *a = new int(2);
std::shared_ptr<int> b(a);
std::shared_ptr<int> c = b;
Maintenant, ils ont tous deux référence au même objet de gestion sous-jacente. Comme chaque shared_ptr
est détruit, le nombre de références sur le int*
est réduit et lorsque la dernière référence est supprimée, l'objet est supprimé.
Un meilleur style est de faire std :: shared_ptr
@ h9uest votre point serait beaucoup plus pertinent si ce n'était pas une modification minimale du code fourni dans la question initiale. Il n'a jamais été destiné à être un exemple parfait de C++, et n'a jamais prétendu l'être. Si vous lisez le commentaire dans le bloc de code, vous verrez que 'make_shared' a été mentionné. – Rook
Vous êtes seulement autorisé à créer un pointeur intelligent une fois à partir d'un pointeur brut. Tous les autres pointeurs partagés doivent être des copies du premier afin qu'ils fonctionnent correctement. Mieux encore: l'utilisation faire partager:
std::shared_ptr<int> sp1 = std::make_shared<int>(2);
std::shared_ptr<int> sp2 = sp1;
EDIT: oublié d'ajouter le deuxième pointeur
- 1. suppression prématurée du pointeur détenu par pointeur partagé
- 2. déclaration de pointeur partagé avant
- 3. highcharts tooltips partagé pointeur
- 4. Boost l'initialisation du pointeur partagé
- 5. Problème de pointeur partagé C++
- 6. Sécurité d'exception C++ pointeur partagé
- 7. Référence converti à pointeur partagé
- 8. pointeur double et structures
- 9. Python à double pointeur
- 10. Double pointeur d'initialisation Mat
- 11. C double pointeur
- 12. Double pointeur Utilisation
- 13. Suppression d'un pointeur
- 14. pointeur suppression Qt méthode
- 15. QObject double suppression
- 16. Suppression et réallouer pointeur global - segfault
- 17. Double pointeur vers la structure
- 18. c tableau de double pointeur
- 19. Double pointeur dans int main
- 20. Comment marshaler un double pointeur?
- 21. C#: pointeur sur un double
- 22. allocation de mémoire double pointeur
- 23. La suppression de ce pointeur
- 24. Crash de suppression de pointeur
- 25. Suppression d'un pointeur d'un vecteur
- 26. Suppression d'une phrase en double
- 27. Suppression d'enregistrements en double spécifiques
- 28. Suppression d'étiquettes d'ancrage en double
- 29. Pointeur de déréférencement qui a été converti en double pointeur
- 30. Pointeur vers auto_ptr au lieu d'un double pointeur classique
Êtes-vous la suppression d'un seul? tu n'es pas censé faire ça. Utilisez make_shared au lieu d'allouer manuellement un. – Kiroxas