2017-09-02 3 views
-2

Le programme suivant m'a donné une erreur d'exécution (Segmentation Fault (SIGSEGV)).Qu'est-ce qu'une référence pendante?

#include <iostream> 
using namespace std; 

int& bar() 
{ 
    int n = 10; 
    return n; 
} 

int main() { 
    int& i = bar(); 
    cout<<i<<endl; 
    return 0; 
} 

Mon professeur m'a dit que c'est un comportement indéfini parce que la référence est pendante. Est-ce qu'il a raison? Si oui, comment l'éviter?

+0

Il doit y avoir une bonne copie pour cela. – hyde

+0

Oui, votre ordinateur a raison lorsqu'il se plaint d'un problème informatique. Alors, quel ** est ** l'erreur exacte? Copiez et collez le message d'erreur dans votre question. Et je ne suis pas sûr que vous ayez une erreur * runtime *; votre compilateur devrait déjà vous avertir. –

+4

Redécouvre-t-il google? – molbdnilo

Répondre

2

Oui, il est en effet un comportement non défini parce que vous retournez une référence à une variable automatique qui sera détruite lors de l'exécution de bar() complète

Vous pouvez l'éviter en écrivant:

#include <iostream> 
using namespace std; 

int& bar() 
{ 
    static int n = 10; 
    return n; 
} 

int main() { 
    int& i = bar(); 
    cout<<i<<endl; 
    return 0; 
} 

Dans ce cas, variable statique n ne sera pas détruit lorsque l'exécution de bar() se termine, il sera détruit lorsque votre programme se termine.