C ++ est tout au sujet de la propriété de la mémoire - aka sémantique de propriété .
Il est de la responsabilité du propriétaire d'un morceau de mémoire allouée dynamiquement de libérer cette mémoire. La question est donc de savoir à qui appartient la mémoire.
En C ++, la propriété est documentée par le type dans lequel un pointeur brut est enveloppé.Par conséquent, dans un bon programme C ++ (IMO), il est très rare ( rare , pas jamais ) de voir des pointeurs bruts passés (car les pointeurs bruts n'ont pas de propriété déduite, nous pouvons donc ne pas dire à qui appartient la mémoire et donc sans une lecture attentive de la documentation, vous ne pouvez pas dire qui est responsable de la propriété).
Inversement, il est rare de voir des pointeurs bruts stockés dans une classe, chaque pointeur brut est stocké dans son propre wrapper de pointeur intelligent. ( NB: si vous ne possédez pas un objet, vous ne devriez pas le stocker car vous ne pouvez pas savoir quand il sortira de sa portée et sera détruit.)
Donc la question:
- Quel type de sémantique de propriété les gens ont-ils rencontrés?
- Quelles classes standard sont utilisées pour implémenter cette sémantique?
- Dans quelles situations les trouvez-vous utiles?
Permet de conserver 1 type de propriété sémantique par réponse afin qu'ils puissent être votés individuellement.
Résumé:
Conceptuellement, les pointeurs intelligents sont simples et une mise en œuvre naïve est facile. J'ai vu de nombreuses tentatives d'implémentation, mais elles sont invariablement interrompues d'une manière qui n'est pas évidente pour une utilisation occasionnelle et des exemples. Ainsi, je recommande de toujours utiliser des pointeurs intelligents bien testés à partir d'une bibliothèque plutôt que de lancer le vôtre. std::auto_ptr
ou l'un des pointeurs intelligents Boost semble couvrir tous mes besoins.
std::auto_ptr<T>
:
Une seule personne possède l'objet. Le transfert de propriété est autorisé.
Utilisation: Cela vous permet de définir des interfaces qui montrent le transfert explicite de propriété.
boost::scoped_ptr<T>
Une seule personne possède l'objet. Le transfert de propriété n'est PAS autorisé.
Utilisation: utilisé pour montrer la propriété explicite. L'objet sera détruit par le destructeur ou lors d'une réinitialisation explicite.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Propriété multiple. Il s'agit d'un simple pointeur compté par référence. Lorsque le nombre de références atteint zéro, l'objet est détruit.
Utilisation: lorsqu'un objet peut avoir plusieurs owers avec une durée de vie qui ne peut pas être déterminée au moment de la compilation.
boost::weak_ptr<T>
:
Utilisé avec shared_ptr<T>
dans les situations où un cycle de pointeurs peut se produire.
Utilisation: Utilisé pour empêcher les cycles de conserver des objets lorsque seul le cycle gère un refcount partagé.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Cela peut-il être reformulé? Je ne comprends pas du tout.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. Les pointeurs RAW n'ont pas de sémantique de propriété. Si vous ne connaissez pas le propriétaire, vous ne savez pas qui est responsable de la suppression de l'objet.Il existe plusieurs classes standard qui sont utilisées pour encapsuler les pointeurs (std :: shared_ptr, std :: unique_ptr etc) qui définissent la propriété et donc définir qui est responsable de la suppression du pointeur.