返回对本地对象的引用时的编译器警告

时间:2010-07-11 19:08:57

标签: c++ reference

如何在不收到警告的情况下返回对象的引用:

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

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

这会导致对恭维的警告。

2 个答案:

答案 0 :(得分:14)

在您的示例中,您将返回对局部变量str的引用。只要GetString()返回,str就会被销毁,并且引用无效(它指的是已被销毁的对象)。

如果返回对象的引用,它必须是在函数返回后仍然有效的对象(例如,它不能是局部变量)。

在这种特殊情况下,您必须按值返回str。返回引用的最常见用途是返回对成员变量的引用的成员函数。

答案 1 :(得分:0)

从技术上讲,你可以创建它到堆并返回一个引用(编辑:内存泄漏的例子,不要在家里尝试这个(感谢James)):

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

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

但除了技术性之外,通过价值传递是更好的选择(如上所述)。