Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回对本地对象的引用时出现编译器警告_C++_Reference - Fatal编程技术网

C++ 返回对本地对象的引用时出现编译器警告

C++ 返回对本地对象的引用时出现编译器警告,c++,reference,C++,Reference,如何返回对对象的引用而不获得警告,例如: std::string& GetString() { std::string str = "Abcdefghijklmnopqrstuvwxyz"; return str; } int main() { std::string str = GetString(); } 这将导致遵从警告。在您的示例中,您将返回对局部变量str的引用。只要GetString()返回,str就会被销毁,并且引用无效(它指的是已销毁的对象)

如何返回对对象的引用而不获得警告,例如:

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

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

这将导致遵从警告。

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

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


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

从技术上讲,您可以将其创建到堆并返回引用(编辑:内存泄漏示例,不要在家中尝试此操作(感谢James)):


但撇开技术问题不谈,这里按值传递是更好的选择(如上所述)。

如果不按值传递,则返回值。当函数需要返回独立于函数调用的值时,返回引用,一般来说。您的示例泄漏了
new
分配的字符串。我只是想避免再次复制对象。@用户:复制东西没有什么错。它一直在做,而且需要一直做。停止担心性能,开始担心良好的编码实践。即使你可以以某种方式返回一个参考,比如在你的问题中。std::string str=GetString()会发生什么
str
是由
GetString
返回的值的副本,无论它是否是引用。但是我可以将str作为引用传递给GetString(str)。@user:可以,但是在这个过程中,您的代码会变丑。另外,C++不是哑语言:标准允许返回值优化,或者RVO。(并命名为RVO,NRVO。)查找这些代码,您将看到现代编译器基本上是如何对您的代码执行这些操作的。不妨坚持使用更容易编码和更清晰的代码。一旦你的应用程序真的运行缓慢,你就可以对其进行分析并测量(不是猜测!)哪些部分运行缓慢,哪些部分可以加快运行速度。就像我说的,好代码第一,性能最后。
string& GetString() {
    string * strPtr;
    strPtr = new string("qweqweqwe");
    string &str2 = (*strPtr);
    return str2;
}

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