2012-10-05 1 views
1

Je suis nouveau à C++ et a couru dans la suite soi-disant bug, mais en quelque sorte mon programme fonctionne très .. Voici le codePourquoi la valeur de retour de la file d'attente: avant() valide après la file d'attente :: pop()

#include<iostream> 
#include<queue> 
#include <string> 


int main() 
{ 
string s ("cat"); 
queue<string> _queue; 
_queue.push(s); 
string & s1 = _queue.front(); 
_queue.pop(); 
// at this time s1 should become invalid as pop called destructor on s 
std::cout << s1 << std::endl; 
return 0; 

} 

Cela fonctionne simplement, même si s1 est une référence à un objet invalide. Existe-t-il un moyen d'affirmer que s1 se réfère vraiment à un objet invalide?

+2

Ceci est un manuel [undefined behavior] (http://en.wikipedia.org/wiki/Undefined_behavior), qui par définition n'est pas "détectable" à l'exécution, car vous êtes déjà en UB-land. – ildjarn

+0

Ty pour l'excellent lien vers UB. – Jimm

+0

Voir [La mémoire d'une variable locale peut-elle être accédée en dehors de sa portée?] (Http://stackoverflow.com/a/6445794/597607) –

Répondre

5

Si vous tentez d'accéder à un objet détruit comme vous le faites dans votre code, le comportement n'est pas défini. Et non, il n'y a pas de moyen fourni par la langue pour effectuer une vérification de l'exécution de cette situation. Il est de votre entière responsabilité de vous assurer que de telles choses ne se produisent pas dans votre code. Le fait que "ça marche" dans votre expérience est juste un accident (avec un certain degré de déterminisme informatique typique, comme d'habitude). Quelque chose de complètement différent peut changer dans votre programme, et ce code ne fonctionnera plus.

+0

Légèrement reliée, serait-ce UB même si la mémoire n'a jamais été accédée, c'est à dire que vous avez fait un allocateur personnalisé qui avait une méthode pour affirmer un pointeur pour la validité? Pas utile normalement, mais pourrait être pour un test. –

+0

se demander pourquoi C++ runtime ne met pas à zéro la mémoire libérée? – Jimm

+0

@Jimm: Certaines implémentations le font, cela dépend de l'allocateur. Mais, pourquoi devrait-il le faire? Quel avantage cela donne-t-il? Tout code qui dépend de cela a un bug. – ildjarn

Questions connexes