0
votes

C ++ Pointants bruts et "Supprimer"


J'ai une question concernant l'extrait de code ci-dessous:

double d = 20.1;
double* pd = new double;
...
pd = &d;
delete pd;


4 commentaires

Oui, c'est ce qui se passe.


Supprimer a besoin de la valeur du pointeur qui résulte de nouveau . Il n'est pas pertinent que cela soit nommé par une variable qui a été immédiatement initialisée à partir de ce résultat. Et ici la variable n'a plus cette valeur correcte.


Vous n'allez pas seulement fuir, vous appelez UB par Supprimer une adresse non obtenue en appelant Nouveau .


Lorsque vous attribuez à une variable, vous perdez la valeur initiale de la variable. Pour un pointeur qui signifie que vous perdez là où il pointait à l'origine. Ce que vous faites est un peu similaire à int A = 10; a = 20; puis je me demande pourquoi a n'est pas égal à 10 plus.


3 Réponses :


4
votes

Oui, vous avez divulgué le double pointeur à l'origine par PD , mais ce n'est pas ce qui cause l'erreur.

L'erreur est le résultat de vous essayant de Supprimer une adresse de pile allouée. C'est un comportement strictement indéfini. Supprimer ne fonctionnera que pour les pointeurs créés avec nouveau .


0 commentaires

1
votes

variables maintiennent des valeurs. Les valeurs du pointeur sont juste cela, les valeurs. Pas de noms. Pas variables.

Lorsque vous manipulez une valeur de pointeur, par exemple pour le transmettre à Supprimer , vous ne vous souciez que de la valeur.

C'est essentiellement équivalent à: xxx

la valeur actuellement dans la variable; pas une valeur antérieure. Pas le nom.

Votre programme tente de compenser ( Supprimer ) Un objet qui n'a pas été attribué par vous (l'utilisateur), mais par le compilateur. < / p>


0 commentaires

0
votes

Cela signifie-t-il que le pointeur " pd " pointe sur l'adresse de la pile de " d " et son orientation originale à l'adresse du tas (côté droit du signe égal de la deuxième ligne) a fui?

Oui, c'est exactement ce que cela signifie.


0 commentaires