临时变量生命周期问题

时间:2023-01-16 09:02:22
class CFirst
{
public:
CFirst()
{
std::cout << "class First constructor" << std::endl;
}
~CFirst()
{
std::cout << "class First destructor" << std::endl;
}
};

class CSecond
{
public:
CSecond()
{
std::cout << "class Second constructor" << std::endl;
}
~CSecond()
{
std::cout << "class Second destructor" << std::endl;
}
};

int main(int argc, char* argv[])
{
CFirst first;
CSecond second;
std::cout << "do something" << std::endl;
return 0;
}

如以上的代码。请问是否second一定比first先析构?我在VC6.0的编译器上试了几次都是second比first先析构。我不敢肯定是否所有的编译器都是如此,还是哪个先析构是随机的。最好能给出铁证。谢谢。

13 个解决方案

#1


呵呵,依稀记得这个应该是压栈的,后构造的先析构

#2


是呀,
先来的先压栈,如果不是那就不是合格的编译器了

#3


haha,慢了

#4


right!

#5


蛮有道理的,再看看有没有其它的理由,过一会儿给分。

#6


没错,是压栈。同意楼上的说法。

#7


那就是说,对于临时变量,它们一定是在出它们的作用域的时候才被依次析构的?而不会在作用域中就被析构了(因为有可能某变量只被使用几次,然后就再也不用了)?

#8


不会在作用域中就被析构;出它们的作用域不一定被析构

#9


to magicblue(小飞侠):“出它们的作用域不一定被析构”,这句不太理解,愿闻其详。

#10


“如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定”

                               ——《Inside The C++ Object Model》paper 275

#11


老兄,当然了,析构函数的调用与构造函数的顺序相反,

#12


首先second、first根本不是临时变量,他们的析构顺序上面已经讲了,所有的编译器都必须遵守。
其次临时对象的生命复杂的多,即使《Inside The C++ Object Model》的作者也没有一个肯定的结论,各个编译器不同。

#13


对,看来我“临时变量”这个词选得不好,和《Inside The C++ Object Model》中的术语含义不同。不过,那应该如何称呼它们呢?

谢谢以上各位的作答,谢谢。

#1


呵呵,依稀记得这个应该是压栈的,后构造的先析构

#2


是呀,
先来的先压栈,如果不是那就不是合格的编译器了

#3


haha,慢了

#4


right!

#5


蛮有道理的,再看看有没有其它的理由,过一会儿给分。

#6


没错,是压栈。同意楼上的说法。

#7


那就是说,对于临时变量,它们一定是在出它们的作用域的时候才被依次析构的?而不会在作用域中就被析构了(因为有可能某变量只被使用几次,然后就再也不用了)?

#8


不会在作用域中就被析构;出它们的作用域不一定被析构

#9


to magicblue(小飞侠):“出它们的作用域不一定被析构”,这句不太理解,愿闻其详。

#10


“如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定”

                               ——《Inside The C++ Object Model》paper 275

#11


老兄,当然了,析构函数的调用与构造函数的顺序相反,

#12


首先second、first根本不是临时变量,他们的析构顺序上面已经讲了,所有的编译器都必须遵守。
其次临时对象的生命复杂的多,即使《Inside The C++ Object Model》的作者也没有一个肯定的结论,各个编译器不同。

#13


对,看来我“临时变量”这个词选得不好,和《Inside The C++ Object Model》中的术语含义不同。不过,那应该如何称呼它们呢?

谢谢以上各位的作答,谢谢。