我对C++的了解是,不应该假定全局实例的构造(和破坏)的顺序。std :: cout保证被初始化?
虽然我用全局实例编写代码,但在构造函数&析构函数中使用std::cout
,我得到了一个问题。
std::cout
也是iostream的全局实例。 std::cout
保证在任何其他全局实例之前被初始化?
我写了一个简单的测试代码,它完美的工作,但我仍然不知道为什么。
#include <iostream>
struct test
{
test() { std::cout << "test::ctor" << std::endl; }
~test() { std::cout << "test::dtor" << std::endl; }
};
test t;
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
它打印
test::ctor
Hello world
test::dtor
是否有可能按预期的代码不能运行?
关联 http://stackoverflow.com/questions/6919593/is-cout-guaranteed-available-during-static-deinitialization这也包括在答案的建设。 – adl 2012-01-09 07:11:12
无法假定静态存储持续时间对象在全局作用域的初始化顺序,但有强制初始化顺序的技巧。 – 2012-01-09 10:04:28
PS。还要注意破坏的顺序是有保证的(与构造相反)。 – 2012-01-09 10:11:59