C++ 操作员内的临时设备寿命+;序列

C++ 操作员内的临时设备寿命+;序列,c++,C++,可能重复: 当从重载的操作符+方法返回临时对象时,我有一个关于临时对象寿命的快速问题。例如,如果表达式 a = b + c + d + e …由重载的运算符+方法计算,这些方法返回临时对象,子表达式b+c返回的临时对象的范围是否为整个表达式的范围 由于g++似乎保留了所有临时变量,而整个表达式都在范围内,因此在a=赋值过程中,可能会保留对这些值的引用以进行延迟求值 是否有人请确认是否对所有C++实现都保证了这种行为? < P>是的,在完整表达式中的所有评价之后,临时对象仅被破坏。(语句是最

可能重复:

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

a = b + c + d + e
…由重载的
运算符+
方法计算,这些方法返回临时对象,子表达式
b+c
返回的临时对象的范围是否为整个表达式的范围

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


是否有人请确认是否对所有C++实现都保证了这种行为?

< P>是的,在完整表达式中的所有评价之后,临时对象仅被破坏。(语句是最常见的一种完整表达式。引用的某些用法会使临时对象持续更长时间。)

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


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

这可能有点离题,但在堆栈上创建的返回临时变量的范围内,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;
但是,VisualStudio10.0会销毁重载运算符成员函数退出后立即在堆栈上创建的retO(使用静态成员递增和递减进行验证,并在所有构造函数和析构函数中进行输出)

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

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

问候,


纳维德

谢谢杰瑞;这正是我所希望的答案。为了避免超越我自己,我不会在这个特定的时间点担心奇怪的异常。再次感谢您的帮助。g++发出编译器警告是正确的。
myObj::operator+(myObj&)
成员函数正在返回对临时对象的引用,该函数实际上应该声明为
myObj::operator+(const myObj&)const
。根据标准,您发布的代码将获得对本地
myObj
对象
ret0
的引用,在退出块(返回)时销毁
ret0
,并返回引用。但请注意,该引用是对已破坏对象的引用,也是对堆栈上分配的对象的引用。非常糟糕。我完全同意——正如我所说的,有点离题,不是简单的类型,而是返回了一个对象引用。但是临时引用的持久性不同,以解决有关编译器差异的问题。当然,解决方案是返回一个新对象,并对同一对象的赋值使用重载+=运算符,并且仅对新对象的赋值使用重载+运算符,以避免内存泄漏。我仍然不明白为什么我没有收到来自MSCV++的警告。已经查看了IDE中的所有选项。。。