{
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
——《Inside The C++ Object Model》paper 275
#11
老兄,当然了,析构函数的调用与构造函数的顺序相反,
#12
首先second、first根本不是临时变量,他们的析构顺序上面已经讲了,所有的编译器都必须遵守。
其次临时对象的生命复杂的多,即使《Inside The C++ Object Model》的作者也没有一个肯定的结论,各个编译器不同。
其次临时对象的生命复杂的多,即使《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
——《Inside The C++ Object Model》paper 275
#11
老兄,当然了,析构函数的调用与构造函数的顺序相反,
#12
首先second、first根本不是临时变量,他们的析构顺序上面已经讲了,所有的编译器都必须遵守。
其次临时对象的生命复杂的多,即使《Inside The C++ Object Model》的作者也没有一个肯定的结论,各个编译器不同。
其次临时对象的生命复杂的多,即使《Inside The C++ Object Model》的作者也没有一个肯定的结论,各个编译器不同。
#13
对,看来我“临时变量”这个词选得不好,和《Inside The C++ Object Model》中的术语含义不同。不过,那应该如何称呼它们呢?
谢谢以上各位的作答,谢谢。
谢谢以上各位的作答,谢谢。