J'ai une question concernant l'extrait de code ci-dessous:
double d = 20.1; double* pd = new double; ... pd = &d; delete pd;
3 Réponses :
Oui, vous avez divulgué le double pointeur à l'origine par L'erreur est le résultat de vous essayant de PD code>, mais ce n'est pas ce qui cause l'erreur. P>
Supprimer code> une adresse de pile allouée. C'est un comportement strictement indéfini. Supprimer code> ne fonctionnera que pour les pointeurs créés avec nouveau code>. p>
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 à C'est essentiellement équivalent à: p> la valeur actuellement dans la variable; pas une valeur antérieure. Pas le nom. P> Votre programme tente de compenser ( Supprimer code>, vous ne vous souciez que de la valeur. p> Supprimer code>) Un objet qui n'a pas été attribué par vous (l'utilisateur), mais par le compilateur. P> < / p>
Cela signifie-t-il que le pointeur "
pd code>" pointe sur l'adresse de la pile de "d code>" et son orientation originale à l'adresse du tas (côté droit du signe égal de la deuxième ligne) a fui? P> blockQuote>Oui, c'est exactement em> ce que cela signifie. p>
Oui, c'est ce qui se passe.
Supprimer code> a besoin de la valeur du pointeur qui résulte denouveau code>. 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 code> une adresse non obtenue en appelantNouveau code>.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; code> puis je me demande pourquoia code> n'est pas égal à10 code> plus.