可能重复:
Guaranteed lifetime of temporary in C++?
Lifetime of temporaries
从重载的operator+
方法返回时,我有一个关于临时对象生命周期的快速问题。例如,如果表达式为......
a = b + c + d + e
...由重载的operator+
方法评估,这些方法返回临时对象,是整个表达式的子表达式b + c
返回的临时范围吗?
由于g ++似乎在整个表达式都在范围内时保留所有临时值,因此可以在a =
赋值期间对这些值进行延迟评估。
有人可以确认所有C ++实现是否都能保证这种行为?
答案 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。
此致
纳维德哈尼