微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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设计中的“通用单例”实现.

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

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

原文地址:https://www.jb51.cc/c/114980.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐