2017-01-24 4 views
0

У меня есть следующий код:возвращаются локальные переменные по ссылке

 int& func(int i){ 
      int *p = &i; 
      return *p; 
     } 

     int& func2(int i){ 
      vector<int> v; 
      v.push_back(i); 
      return v[0]; 
     } 

     int & func3(int i){ 
      array<int,4> arr; 
      arr[0] = i; 
      return arr[0]; 
     } 

     int& func4(int i){ 
      int j = i; 
      return j; 
     } 

    int main(){ 

     cout<<func(3)<<endl; 
     cout<<func2(10)<<endl; 
     cout<<func3(100)<<endl; 
     cout<<func4(123)<<endl; 

    return 0; 
    } 

outuput: 
3 
0 
100 
segmentation faul(core dumped) 

вызова функ это нормально, потому что в то время как р является локальным * р я, и живет в глобальном масштабе (?). вызов func2 return 0, что для меня не имеет смысла, я ожидал иметь ошибку сегментации, так как v является локальным вектором ... вызов func3 возвращает правильное значение, и это тоже не имеет смысла, для того же причина как выше. вызов func4, наконец, делает то, что я ожидал, давая segmentatioun fault

Может кто-нибудь помочь мне понять, что происходит в глубине? почему вектор и массив работают, поскольку они были объявлены как статические? на самом деле, учитывая, что все функции возвращают ссылку, я ожидал иметь ошибку сегментации, так как вектор и массив являются локальным объектом, и они должны быть удалены после завершения функции.

очень благодарит

+5

* Отсутствие * функций в коде, который вы показываете, фактически работает (даже не 'func'), все они приводят к * неопределенному поведению *. И как только у вас есть * неопределенное поведение *, это действительно бесполезно в спорах. –

+0

_and i живет в глобальном масштабе (?) _ Что дало вам эту идею? Во всех примерах 'i' является переменной, которая является локальной для функции. –

+0

Я предполагал, что, поскольку выход был совпадающим значением i, переданным в func. –

ответ

5

Неопределенное поведение происходит там. Возвращаемый локальный параметр или переменная по ссылке - это неопределенное поведение, так же, как возврат к нему адреса.

+0

спасибо, что на данный момент мой вопрос: правильно ли возвращать локальную ссылку/указатель на глобальные объекты? –

1

Если вы хотите или должны возвращать ссылку, а затем использовать статическую переменную:

int& my_func(int variable) 
{ 
    static int some_value = 0; 
    some_value = variable; 
    return some_value; 
} 

Ключевое слово static говорит компилятору, что переменная будет иметь срок службы после выполнения оставляет функцию.

Чтобы вернуть ссылку, необходимо, чтобы ссылался на на переменную, которая не исчезнет после выполнения функции.

+0

спасибо, тогда мой вопрос: могу ли я вернуть локальную ссылку/указатель, привязанный к глобальным объектам? –

+0

Да, вы можете возвращать ссылки на глобальные и локальные переменные файла. –

Смежные вопросы