2010-09-23 5 views
0

J'ai un objet dit.supprimer un pointeur d'objet se référant par deux pointeurs

ClassA *obj1 = new ClassA; 

ClassA *ptr1 = obj1; 
ClassA *ptr2 = obj1; 

Quand je fais delete ptr1;, cela affectera ptr2? Si oui, quelle peut être la bonne solution pour cela?

+1

Je suppose que 'obj2' est supposé être' obj1'? Dans tous les cas, la solution est [arrêter la gestion manuelle de la mémoire] (http: // stackoverflow.com/questions/3681455/quoi-est-la-philosophie-de-gestion-mémoire-en-c/3681471 # 3681471). – GManNickG

Répondre

2

(en supposant que obj2 est censé être obj1)

ClassA *x définit un pointeur qui peuvent pointer vers des objets de type ClassA. Un pointeur n'est pas un objet lui-même. Alloue (et construit) un objet réel de type ClassA. Par conséquent, la ligne Class A *obj1 = new ClassA; définit un pointeur obj1, puis le définit pour pointer vers un objet nouvellement alloué de type ClassA.

La ligne Class A *ptr1 = obj1; définit un pointeur ptr1 et définit ensuite pour pointer vers la même chose obj1 pointe vers, qui est l'objet ClassA que nous venons de créer.

Après la ligne Class A *ptr2 = obj1;, nous avons trois pointeurs (obj1, ptr1, ptr2) pointent tous vers le même objet.

Si nous faisons delete ptr1; (ou de manière équivalente, delete obj1; ou delete ptr2;), nous détruisons l'objet pointé. Après cela, tout pointeur qui pointait vers l'objet est rendu invalide (ce qui répond à votre première question: oui, cela affectera ptr2 dans le sens où ptr2 ne pointera pas vers un objet valide par la suite).

La bonne solution dépend de ce que vous essayez d'atteindre:

  • Si vous voulez deux copies de l'objet, en supposant ClassA a un constructeur de copie, faire ClassA *ptr2 = new ClassA(*obj1);. Vous aurez besoin de delete ce nouvel objet séparément lorsque vous avez terminé avec!
  • Si vous souhaitez deux pointeurs vers le même objet, envisagez d'utiliser quelque chose comme boost::shared_ptr (google)

Hmm, c'est beaucoup de texte si simple q + a. Et bien.

+0

Thnx maintenant beaucoup eu ce concept. – boom

1

En supposant obj2 est censé être obj1 alors oui, appelant supprimer le ptr1 laissera ptr2 avec des données non valides. La solution à ce problème serait de régler ptr1 à NULL si vous voulez le vider sans perdre l'objet pointé dans ptr2.

Supprimer est juste pour quand vous voulez libérer complètement la mémoire. Si vous souhaitez conserver l'objet et les données pointées, mais souhaitez effacer le pointeur, définissez-le sur NULL (ou (void *) 0).

+3

En C++, 'NULL' est juste 0 (ou équivalent), pas un type de pointeur. – GManNickG

Questions connexes