如何在不收到警告的情况下返回对象的引用:
std::string& GetString()
{
std::string str = "Abcdefghijklmnopqrstuvwxyz";
return str;
}
int main()
{
std::string str = GetString();
}
这会导致对恭维的警告。
答案 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;
}
但除了技术性之外,通过价值传递是更好的选择(如上所述)。