操作员+序列内的临时寿命

Lifetime of temporary within operator+ sequence

本文关键字:操作员      更新时间:2023-10-16

可能重复:
在C++中保证临时的使用寿命
临时期限

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

a = b + c + d + e

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

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

有人能确认一下这种行为是否对所有C++实现都有保证吗?

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

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

是的,只有在完整表达式中的所有求值之后,才会销毁临时对象。(语句是最常见的完整表达式。某些引用的使用会使临时对象持续更长时间。(

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

我刚刚创建了一个对象,名为say 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对象的问题是内存泄漏,因为上面的构造没有保留对分配给myObj2的新myObj实例化的引用。

问候,

导航