2010-04-27 4 views
0

Serait-il intelligent d'avoir un vecteur dans un objet avec une liste de pointeurs qui pointent vers lui?Objets pointeurs sécurisés?

De cette façon, lorsque l'objet est supprimé, il peut supprimer tous les pointeurs pointant vers lui pour empêcher une exception null-pointer?

+0

"il pourrait supprimer tous les pointeurs pointant vers lui" Voulez-vous dire tous les objets qui pointent vers lui. La réponse à ces questions est inévitablement que cela dépend de ce que vous faites, mais probablement non. –

Répondre

1

Si votre but ultime est de détecter lorsqu'un objet est libéré des utilisateurs de l'objet, le mieux étant d'utiliser une sémantique de pointeur faible. Il existe une implémentation dans la bibliothèque Boost Smart Pointer (voir weak_ptr). Il résout le problème que vous décrivez en inversant le graphique de référence que vous décrivez. Les pointeurs font référence à une seule instance de compteur commune qui, lorsque l'expéditeur supprime l'objet qu'il définit à zéro. Par conséquent, parce que toutes les références weak_ptr pointent vers le compteur unique, ils voient tous le changement immédiatement et vous pouvez donc dire quand l'objet s'en va.

3

Non, certainement pas. Vous pouvez seulement supprimer un pointeur à quelque chose une fois; libérant quelque chose qui a déjà été supprimé (« double-libération ») est définie

A* foo = new A(); 
A* bar = foo; 
delete foo; 
delete foo; // <-- BAD 
delete bar; // <-- EQUALLY BAD 

On dirait que vous cherchez quelque chose comme auto_ptr; vous pourriez vouloir examiner cela. Si vous cherchez à mettre à zéro tous les pointeurs qui pointent vers votre objet lorsqu'il est détruit, il n'y a aucun moyen de le faire

+0

En bref pas une idée très intelligente. –

0

Je ne comprends pas vraiment ce que vous voulez atteindre, mais supprimer x fois le même pointeur ne sera pas aller loin ...

Si vous voulez éviter d'avoir des mauvais pointeurs après un delete happenned, vous devriez regarder des pointeurs intelligents, et en particulier boost::shared_ptr.

L'objet pointé est garanti à être supprimé lorsque le dernier shared_ptr pointant vers elle est détruite ou remis à zéro.

utilisant vous n'avez plus manuellement delete les pointeurs, le shared_ptr le fait par lui-même.

En général aide à travailler avec pointeur, vous pouvez consulter d'autres boosts smart pointers ou std::auto_ptr

0

Sur le plan technique, le problème que vous essayez de résoudre sont « Dangling pointeurs ». Jetez un oeil à auto_ptr et cherchez aussi des "pointeurs intelligents" ... au moins je suppose que votre intention est de mettre à zéro tous les pointeurs pointant vers votre objet.

Il est très difficile ou au moins étrange que chaque fonction utilisant vos objets fournit également l'adresse de l'endroit où il est stocké. Il est difficile ces objets et pointeurs peuvent être copiés hors de votre contrôle (encore plus facile avec un memcpy)

Certains outils comme valgrind peuvent vous aider avec cela aussi

Questions connexes