c – 全局向量在调用之间清空?

我在标题中有一个向量,如下所示:
extern std::vector<Foo> g_vector;

在关联的cpp文件我有这个:

std::vector<Foo> g_vector;

我也有一个类Bar,在它的构造函数中它会向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;
}

如果我在一个函数中声明一个Bar,就像一个理智的人,它似乎工作正常.但是,如果我想在函数之外声明一个Bar,就会发生奇怪的事情.例如,我在MyFile1.cpp和MyFile2.cpp中声明了一个Bar,并且由于我在Bar中的cout语句,我可以看到Foo被推入向量,但是当下一个Bar运行其构造函数时,向量的大小为0再次.换句话说,我的输出

0
1
0
1

是什么赋予了?为了更加双重确定,我还尝试打印出& g_vector以确保它实际上是push_backing到正确的向量,并且地址都匹配.对于它的价值,这些东西在向量中的顺序并不重要.我不关心初始化顺序或任何事情.

解决方法

不确定问题究竟是什么,但我想以下模式将有助于解决它:定义全局变量的访问器并将其分配为静态函数变量,如下所示.

在头文件中:

std::vector<Foo> &getGlobalVector();

在cpp文件中:

std::vector<Foo> &getGlobalVector()
{
  static std::vector<Foo> s_vector;
  return s_vector;
}

这种模式的灵感来自于Andrei Alexandrescu在Modern C设计中的“通用单例”实现.

每当我在保持现有应用程序的同时(或者在极少数情况下我实际上选择自己使用一个应用程序)时,我已经习惯于系统地使用这种模式,并且它可能有助于消除一些硬 – 在所述应用程序中重现错误.

无论如何,这应该有助于避免任何多初始化或初始化顺序相关的问题.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...