运算符+序列中的临时生命周期

时间:2011-07-10 03:44:29

标签: c++

  

可能重复:
  Guaranteed lifetime of temporary in C++?
  Lifetime of temporaries

从重载的operator+方法返回时,我有一个关于临时对象生命周期的快速问题。例如,如果表达式为......

a = b + c + d + e

...由重载的operator+方法评估,这些方法返回临时对象,是整个表达式的子表达式b + c返回的临时范围吗?

由于g ++似乎在整个表达式都在范围内时保留所有临时值,因此可以在a =赋值期间对这些值进行延迟评估。

有人可以确认所有C ++实现是否都能保证这种行为?

3 个答案:

答案 0 :(得分:6)

是的,在通常的情况下:“作为评估的最后一步,临时对象被销毁 完整表达式(1.9)(词汇上)包含创建它们的点。“(§12.2/ 3)。

有几个例外,但这里不适用。

答案 1 :(得分:1)

是的,只有在full-expression中进行所有评估后才会销毁临时对象。 (语句是最常见的完整表达式。引用的某些用法可以使临时对象的持续时间更长。)

答案 2 :(得分:0)

这可能有点偏离主题,但G ++(MinGW 4.4.1)和MSCV ++ 10在堆栈上创建的返回临时变量范围内存在差异。

我刚创建了一个名为myObj的对象,类成员是坐标,向量,等等......

该类有一个默认构造函数,另一个初始化类成员的构造函数,一个复制构造函数,以及重载的+,+ =和=运算符。

myObj & myObj::operator+(myObj & mO)
{
    myObj retO = myObj(mO); // using a non-default constructor defined
    retO += *this;          // Uses the other overloaded operator defined.
    return retO;
}

+运算符在堆栈上分配myObj对象(不使用new)并添加对象* this和mO(通过retO)并将它们分配给在堆栈上创建的retO对象。

G ++允许您致电:

myObj2 = myObj1 + myObj2;

但是,Visual Studio 10.0会在重载的运算符成员函数退出后立即销毁在堆栈上创建的retO(使用静态成员增量进行验证,并在所有构造函数和析构函数内使用输出进行验证)。

我不知道标准如何定义此行为。奇怪的是,MinGW给出了编译器警告,而MSVC ++ 10没有。

当然,使用new关键字创建一个新的myObj对象的问题是内存泄漏,因为上面的构造没有保留对myObj实例化的引用,该实例化被分配给myObj2。

此致

纳维德哈尼