Предупреждение компилятора при возврате ссылки на локальный объект - PullRequest
2 голосов
/ 11 июля 2010

Как вернуть ссылку на объект без предупреждения, например:

std::string& GetString()
{
    std::string str = "Abcdefghijklmnopqrstuvwxyz";
    return str;
}

int main()
{
    std::string str = GetString();
}

Это приводит к предупреждению о комплименте.

Ответы [ 2 ]

14 голосов
/ 11 июля 2010

В вашем примере вы возвращаете ссылку на локальную переменную str.Как только возвращается GetString(), str уничтожается, а ссылка недействительна (это относится к уничтоженному объекту).

Если вы возвращаете ссылку на объект, это должен быть объектэто все еще будет действительным после того, как функция вернется (например, она не может быть локальной переменной).

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

0 голосов
/ 11 июля 2010

Технически вы можете создать его в куче и вернуть ссылку (редактировать: пример утечки памяти, не пытайтесь сделать это дома (спасибо Джеймсу)):

string& GetString() {
    string * strPtr;
    strPtr = new string("qweqweqwe");
    string &str2 = (*strPtr);
    return str2;
}

int main() {
    string str = GetString();
    return 0;
}

Но, если не считать технических особенностей, здесь лучше использовать переход по значению (как сказано выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...