Je suis encore nouveau à c + + et ai étudié la portée de l'objet.
J'ai testé le code ci-dessous et ai été témoin de certains comportements étranges.Pourquoi ce pointeur est-il valide lorsque son objet est hors de portée? (Et quelques autres comportements étranges)
struct Test
{
int value, value2;
Test() : value(1), value2(10) {};
};
Test* GetTestPointer() {
Test t;
t.value = 20;
return &t;
}
int main() {
Test* tp = GetTestPointer();
int a = tp->value;
int b = tp->value2;
cout << a << endl;
cout << b << endl;
return 0;
}
Sortie:
20
10
Je pensais que Test t
irait hors de portée si déréférencement ses valeurs dans le principal serait soit jeter une exception ou une valeur vide. Pourquoi obtient-il des valeurs valides comme si l'objet était toujours vivant?
En fait, ce que je l'origine essayé:
Test* tp = GetTestPointer();
cout << tp->value << endl;
cout << tp->value2 << endl;
Sortie:
20
18223279
Ici value2
est d'agir comme il est invalide, mais je peux obtenir value
très bien.
Inversement, je les ai essayé réordonnancement:
Test* tp = GetTestPointer();
cout << tp->value2 << endl;
cout << tp->value << endl;
Sortie:
10
1459403656
Notez que rien de tout cela est arrivé lorsque je bien tp
avec new
initié, comme prévu.
Je sais que je n'écrirais jamais de code comme ça dans la vraie vie, mais je suis vraiment curieux de savoir pourquoi tout cela se passe.
- Quand est-ce que
t
est hors de portée dans ce cas? - Qu'est-ce que la commande de
cout
a quelque chose à voir avec ce quetp
est déréférencement? Pourquoi est-ce que quand je les sauvegarde dans des tampons, est-ce que je peux obtenir les bonnes valeurs?
Vous avez eu de la chance. C'est un comportement indéfini. – tilz0R
_Pourquoi ce pointeur est-il valide_ - il ne l'est pas. Le comportement indéfini est indéfini. –
A quoi ressemblerait une valeur "vide"? – molbdnilo