C++ 全局向量在调用之间清空自身?
标题中有一个向量,如下所示:C++ 全局向量在调用之间清空自身?,c++,C++,标题中有一个向量,如下所示: extern std::vector<Foo> g_vector; Bar::Bar(/* stuff */) { // do things std::cout << g_vector.size() << std::endl; g_vector.push_back(somefoo); std::cout << g_vector.size() << std::endl; }
extern std::vector<Foo> g_vector;
Bar::Bar(/* stuff */)
{
// do things
std::cout << g_vector.size() << std::endl;
g_vector.push_back(somefoo);
std::cout << g_vector.size() << std::endl;
}
如果我在一个函数中声明一个条
,就像一个正常人一样,它似乎工作正常。然而,如果我想在函数外部声明一个条
,就会发生奇怪的事情。例如,我在MyFile1.cpp和MyFile2.cpp中声明了一个Bar
,由于我在Bar中的cout语句,我可以看到Foo
被推到向量中,但当下一个Bar
运行其构造函数时,向量的大小再次为0。换句话说,我的输出是
0
1
0
1
有什么好处?为了进一步确认,我还试着打印出
&g_向量
,以确保它实际上是推回到正确的向量中,并且地址都匹配。不管它值多少,这些东西在向量中的顺序都不重要。我不关心初始化顺序或任何东西。全局值的初始化顺序没有定义
请在这里阅读有关这个问题的文章
当您在函数中声明Bar
时,g_向量
将在之前初始化,因为它承诺在程序运行之前初始化。如果Bar
是一个全局变量,那么您就有问题了。不确定问题到底是什么,但我想以下模式将有助于解决问题:定义全局变量的访问器,并将其分配为静态函数变量,如下所示
在头文件中:
std::vector<Foo> &getGlobalVector();
std::vector&getGlobalVector();
在cpp文件中:
std::vector<Foo> &getGlobalVector()
{
static std::vector<Foo> s_vector;
return s_vector;
}
std::vector&getGlobalVector()
{
静态std::向量s_向量;
返回s_向量;
}
该模式是Andrei Alexandrescu在现代C++设计中实现的“通用单体”的启发。
我养成了在维护现有应用程序时遇到现有全局变量时系统地使用此模式的习惯(或者在极少数情况下我自己实际选择使用一个),这可能有助于消除上述应用程序中的一些难以重现的错误
无论如何,这确实有助于避免任何多个初始化或与初始化顺序相关的问题。您是否有理由相信您的g_向量将在静态Bar
实例之前构建?
std::vector<Foo> &getGlobalVector()
{
static std::vector<Foo> s_vector;
return s_vector;
}