加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:19:49 所属栏目:百科 来源:网络整理
导读:我在标题中有一个向量,如下所示: extern std::vectorFoo g_vector; 在关联的cpp文件中我有这个: std::vectorFoo g_vector; 我也有一个类Bar,在它的构造函数中它会向g_vector添加一些东西,如下所示: Bar::Bar(/* stuff */){ // do things std::cout g_vect
我在标题中有一个向量,如下所示:
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设计中的“通用单例”实现.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读