你能在C ++中返回一个字符串对象的局部变量吗?

时间:2013-12-29 23:09:17

标签: c++ memory-leaks copy-constructor

我在某处发现了以下代码,我想知道它是否合法在C ++中。 ret变量是堆栈变量,一旦foo返回分配给ret的内存不再存在。但是string是一个类,我认为复制构造函数被调用来将ret的内容复制到var。这是真的?以下是一段有效的代码吗?

    string foo(int x)
    {
        string ret; 
        //some operation on ret

        return ret; 
    }
    string callingFunc()
   {
        string var = foo(2); 
        // some operation on var
   }

2 个答案:

答案 0 :(得分:5)

是的

实际构建了3个对象:由于ret而导致string ret;,由于return ret;导致临时,var由所提到的返回临时值构建。

编译器可能会直接从var优化临时构建ret

答案 1 :(得分:0)

代码不合法​​:callingFunc()被声明为返回std::string但未返回任何内容。如果调用此函数并且没有异常退出,则会出现未定义的行为。

函数foo()是正确的,但是:您可以按值返回局部变量。从概念上讲,它们将被复制(或移动,这是一个类似于复制构造函数的构造函数,但指示复制的对象将消失,并且可以在结果中更改其内容),在return - 语句之前功能存在。但是,当直接返回变量时,允许编译器忽略该副本(基本上,该对象直接构造在预期返回值的位置,不需要复制)。