2010-04-18 6 views
1

J'ai une classe avec un vecteur de pointeurs vers des objets. J'ai introduit quelques éléments sur ce vecteur, et sur mon fichier principal, j'ai réussi à les imprimer et à en ajouter d'autres sans aucun problème. Maintenant j'essaye de retirer un élément de ce vecteur et de vérifier si ce n'est pas NULL mais ça ne marche pas.Problème C++ avec des pointeurs sur des objets

Je le remplir avec de la classe Test:

Other *a = new Other(1,1); 
Other *b = new Other(2,2); 
Other *c = new Other(3,3); 

v->push_back(a); 
v->push_back(b); 
v->push_back(c); 

Et sur mon dossier principal je:

Test t; 
(...) 

Other *pointer = t.vect->at(0); 

delete t.vect->at(0); 
t.vect->erase(t.vect->begin()); 

if (pointer == NULL) { cout << "Nothing here.."; } // Never enters here.. 
+0

vous suffit de définir le pointeur sur NULL juste après l'avoir supprimé. cela peut sembler redondant, mais ce n'est pas le cas. delete libère la mémoire, la définissant sur NULL, vérifie qu'elle a été supprimée. – zxcvbnm

+0

@zxcvbnm: c'est une bonne pratique, mais ça ne marchera pas dans ce cas. Zibd a deux pointeurs pointant vers le même objet; en utilisant l'un d'entre eux pour supprimer l'objet, puis en le définissant sur NULL laisse toujours l'autre pointant vers la mémoire libérée. – Beta

Répondre

2

La suppression de la mémoire pointée par un pointeur, ne définit pas la pointeur sur NULL.

4

La suppression d'un pointeur n'a pas besoin de le réinitialiser, il libère simplement la mémoire qui y est affectée. L'utilisation de pointer est indéfinie après la suppression, car la mémoire est libre d'être utilisée pour d'autres choses. Techniquement, la spécification C++ laisse intentionnellement aux implémentations si elles veulent ou non effacer un pointeur supprimé, mais pratiquement aucune à ma connaissance

+0

Droite. Dans ce cas, y a-t-il un moyen de faire ce que je prétends? – dmessf

+0

Je ne suis pas sûr de ce que vous essayez de faire, quel est le point de ce contrôle? –

+0

De toute façon, notez que le pointeur dans le vecteur est supprimé, mais c'est une copie complètement différente de la même adresse qui est vérifiée. L'exécution C++ ne peut en aucun cas effectuer une recherche sur l'ensemble de votre programme pour chaque copie de l'adresse et les définir tous sur null. –

1

Vous définissez un pointeur égal à l'adresse de quelque chose, et vous ne l'avez plus jamais touché, alors bien sûr, ce ne sera pas nul. Le fait que vous ayez alors fait quelque chose à l'objet n'est pas pertinent.

En utilisant des pointeurs simples, il n'y a pas de moyen sûr pour le pointeur de déterminer si l'objet qu'il a pointé a été supprimé. La manière la plus simple de faire ce que vous semblez faire est de le laisser aux conteneurs: si vous êtes intéressé par cet objet, recherchez le pointeur dans le vecteur pour voir s'il est toujours là (et ne supprimez pas l'objet sans effacer l'élément correspondant du vecteur, ou vous aurez encore le même problème).

0

Pour surmonter la vérification d'un problème ptr supprimé, vous pouvez utiliser boost::shared_ptr.

Au lieu d'utiliser de suppression .reset() et pour vérifier si le PTR est encore l'utilisation valable .get()
(vous pouvez en fait il suffit d'utiliser if(p) où p est le shared_ptr parce qu'il a une conversion Bool)

Questions connexes