2010-06-30 5 views
1

Disons que nous avons un morceau de code:`delete` pas clairement et pointeurs

//... 
class A 
//... 
A* myA = new A(); 
A* myPointerToMyA = myA; 
delete myA; 
delete myPointerToMyA; // this is wrong, no? 
//... 

La dernière ligne fait exactement la même chose que celui ci-dessus, la corriger? Donc je serais maintenant delete en utilisant un pointeur invalide/NULL? Je comprends que c'est peut-être une question stupide, mais encore, j'ai besoin d'être rassuré.

Répondre

1

Vous avez raison.

Donc, je voudrais maintenant supprimer un pointeur invalide/NULL?

Eh bien, techniquement, c'est seulement invalide, parce que rien n'a été mis à NULL. It's ok to delete a NULL pointer.

+0

Il est important de noter qu'il devrait définir myPointerToMyA sur NULL, pas sur myA (puisque vous n'avez pas rendu cela entièrement clair). –

+0

La définition du pointeur sur NULL ne fera rien pour supprimer le second pointeur. –

+0

Clarifié. Merci. – Cogwheel

0

Oui, c'est faux. La mémoire allouée pour attribué avec new A() et publié avec delete myA. Une chose à noter est que tandis que delete myPointerToMyA est une tentative de supprimer un pointeur invalide, ce n'est pas une tentative de supprimer un pointeur NULL, car myPointerToMyA n'est pas égal à NULL.

1

Ce que vous obtenez ici est la suivante:

A* myA = new A();   // myA is now equal to 0x11110000 for example(!) 
A* myPointerToMyA = myA; // myPointerToMyA is now equal to 0x11110000 
delete myA;    // equal to delete (A*)(0x11110000) 
delete myPointerToMyA;  // equal to delete (A*)(0x11110000) 

Deux dernières lignes sont égales à la fin. Ce code conduira à un comportement indéfini.

5

En effet, c'est faux. Et contrairement à l'un des autres commentaires, ce n'est pas parce que vous ne l'avez pas alloué avec du nouveau.

Tant myA que myPointerToMyA pointent du même côté. La suppression à travers l'un d'entre eux est bien - mais vous ne pouvez le supprimer qu'une fois légitimement parce qu'ils pointent à la même chose - c'est ce qui est pointé à ce qui est supprimé, pas le pointeur lui-même.

Il n'y a rien de mal à avoir deux pointeurs sur la même chose, mais vous devez savoir qui en est le propriétaire et qui est responsable de sa suppression.

Dans ce cas, en supprimant un pointeur sur un objet supprimé, le comportement est 'indéfini' - l'exécution peut faire ce qu'elle veut! (Je peux à peu près garantir que vous ne l'aimerez pas ...)

5

Oui, c'est faux. Lorsque vous avez utilisé delete, vous ne supprimez pas le pointeur. Au contraire, vous supprimez ce qu'il pointe vers. Ainsi, lorsque vous utilisez delete on un pointeur, la mémoire vers laquelle ce pointeur pointe est libérée. Tout autre pointeur qui pointe vers cette mémoire pointe maintenant vers la mémoire non allouée et est un pointeur dangling. L'utilisation d'un pointeur dangling entraîne un comportement indéfini, et il n'est certainement pas valable d'essayer de libérer de la mémoire déjà libérée, donc utiliser delete sur un pointeur qui pend est définitivement faux. Cela entraînera probablement une erreur de segmentation.

+1

Ou dans un double gratuit, ce qui est encore pire. –

0

Deux pointeurs pointent vers le même objet. L'objet est détruit après avoir appelé delete myA; pour la première fois. Lorsque vous appelez la suppression pour la deuxième fois (delete myPointerToMyA;), vous essayez de supprimer l'objet plusieurs fois et le résultat d'une telle action est indéfini (en général, vous obtenez une exception d'exécution).