正在返回堆栈变量

时间:2013-03-10 21:21:00

标签: c++

我正在阅读以下问题:

How to "return an object" in C++?

(询问在C ++中返回对象)

特别是以下答案:

https://stackoverflow.com/a/3350418/997112

Thing calculateThing() {
    Thing thing;
    // do calculations and modify thing
     return thing;
}
肯定这个答案不会起作用,因为定义的变量将不再存在,因为它在堆栈上并且仅在函数持续时间的范围内?

3 个答案:

答案 0 :(得分:1)

它会起作用,因为(至少在语义上),您将向变量调用者返回变量的副本。现在,实际副本可能会通过return value optimization省略,所以在这种表达方式中

Thing t = calculateThing();

函数体中的thing通常会被构造到t的位置。但t实际上是thing的副本,因为它具有相同的价值。

答案 1 :(得分:1)

该函数内的thing将在返回后销毁,但会被复制到调用方的另一个Thing对象。

Thing new_thing = calculateThing();

new_thing包含thing返回的calculateThing内容。

注意:有一个棘手的问题,我假设有明确定义的复制构造函数或赋值运算符,以防new中有delete / Thing个东西

<强>更新 正如juanchopanza评论的那样,RVO将避免在该函数内创建thing。实际上,new_thing将被thing隐式替换,并且不会执行额外的复制。显然不会发生破坏。

答案 2 :(得分:0)

这是有效的,因为thing被复制/移入返回值(返回值是与thing不同的对象,除非发生复制省略,在这种情况下{{1}的生命周期}被扩展到返回值的生命周期。)

thing

如果发生复制省略,则所有三个对象可能是同一个对象。