Возвращать ссылку в c ++ при использовании Visual Studio и Codeblocks - PullRequest
0 голосов
/ 24 мая 2018

Я изучаю C ++.Я использую Visual Studio 2015 и кодовые блоки IDE для кода C ++.Я попытался написать программу, которая возвращает ссылочную переменную из функции, и я получаю разные результаты (два результата) из 2 IDE (Visual Studio 2015 и кодовые блоки), хотя я выполняю один и тот же код.Я попытался написать следующий код:

#include <iostream>
using namespace std;
class Demo
{
public:
  int a;
};
//I wrote a function that returns a reference variable
Demo& func()
{
   Demo temp;
   temp.a = 1;
   return temp;
}
int main() 
{
  Demo& d = func(); //it error if I run this code on Codeblocks and it run 
                   //smoothly if I run it on Visual Studio 2015
  cout<<d.a;
  return 0;
}

Я знал, что это зависит от компилятора, но я хочу знать, что правильно в этом случае?Заранее благодарен!

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Прежде всего обратите внимание, что поведение программы определяет компилятор , а не IDE (программа, которую вы используете для написания кода).Другими факторами являются то, что в настоящий момент находится на диске и что вы получаете в качестве ввода (например, от пользователя, сети), системные часы и т. Д.

Теперь, как правильно указывает @DeiDei, вы получаете другое поведение, потому что ваш func() Функция возвращает ссылку на локальную для нее переменную и выходит из области видимости после завершения ее выполнения.Его память в стеке (или связанный с ним регистр) может использоваться другими данными - и вы не получаете никаких гарантий относительно того, что происходит при обращении к ним.Это пример компилируемого кода, который имеет Неопределенное поведение при запуске.

Наконец, большинство компиляторов предупредит вас об этом - и я уверен, что это верно для обоих компиляторов, используемых вашими IDE.,Поэтому вам следует:

  1. Включить флаги предупреждений компилятора.
  2. Прочитать предупреждения и адресовать их.
0 голосов
/ 24 мая 2018

Это действительно просто.Когда функция func достигает последней строки, время жизни temp заканчивается.Всякий раз, когда вы пытаетесь получить доступ к этому значению, появляется segmentation fault, который сообщает вам, что вы пытаетесь получить доступ к недопустимому месту в памяти.

Я действительно не могу объяснить причину вашего успеха в Visual Studio больше, чемудачи.

0 голосов
/ 24 мая 2018

То, что вы делаете, это неопределенное поведение, так как вы возвращаете ссылку на что-то, что разрушается, когда функция выходит из области видимости.То, что работает в VS2015, это просто случайность.

Если вы хотите вернуть локально созданный объект, то либо возвращаете его по значению, либо динамически выделяете его и возвращаете как указатель, используя либо shared_ptr, либо unique_ptr.

...