C++ 通过调用c+中的静态类函数初始化全局静态变量+;

C++ 通过调用c+中的静态类函数初始化全局静态变量+;,c++,static,global-variables,static-libraries,C++,Static,Global Variables,Static Libraries,不知道如何正确地表述这个问题,但问题是 我有一个静态库,其中在a.h中有以下类: #pragma once #include <vector> class A{ public: void Run() { data_.push_back(10); std::cout << "size: " << data_.size() << std::endl; } private: static std::vector<int> dat

不知道如何正确地表述这个问题,但问题是

我有一个静态库,其中在a.h中有以下类:

#pragma once
#include <vector>
class A{
public:
 void Run() {
  data_.push_back(10);
  std::cout << "size: " << data_.size() << std::endl;
 }
private:
 static std::vector<int> data_;
};
现在,我使用上述静态库的主要应用程序如下:

#include "a.h"
std::vector<int> A::data_;
#include <iostream>
#include "a.h"
#include "b.h"

static std::string var1= B::Get();

int main(int argc, char** argv)
{
  A a;
  a.Run();
}
#包括
#包括“a.h”
#包括“b.h”
静态std::string var1=B::Get();
int main(int argc,字符**argv)
{
A A;
a、 Run();
}
试图理解为什么输出是:

尺码:1

尺码:1

对于整个类,每个静态数据成员都应该有一个实例,因此应该有一个对::data_uu构造函数的调用。 我在打吗?也就是说,数据在我使用之前没有初始化,但是我应该得到崩溃

现在让我们想象一下,我的数据保存着动态初始化的项目(一些没有POD的东西)。如果在最后数据包含一项,尽管我插入了2项,它将如何被销毁

这就是我的真实代码中实际发生的情况(有时在数据销毁过程中崩溃)

摆脱全局静态(static std::string var1=B::Get();)解决了这个问题,但我仍然想了解引擎盖下的问题

所述案例可在VS2015中复制(实际案例可在gcc 6.2中复制)

我是不是遇到了“静态初始化命令失败”

很有可能

通过函数调用使类的
静态
数据可用,可以消除该问题。例如

class A{
public:
 void Run() {
  getData().push_back(10);
  std::cout << "size: " << getData().size() << std::endl;
 }
private:
 static std::vector<int>& getData();
};

std::vector<int>& A::getData()
{
   static std::vector<int> data;
   return data;
}
A类{
公众:
无效运行(){
getData()。向后推_(10);

std::cout@R Sahu,是的,你的建议确实解决了这个问题。尽管还有一个更重要的细节:如果在类的析构函数中需要调用任何静态函数,请确保在costructor中执行相同的调用,否则它可能已经被析构函数了。@Tadzys,我不记得如何构造和销毁
static
obje函数内部的cts是一个问题,如果您遇到任何问题,请用相关的详细信息开始另一篇文章。@R Sahu,假设我的getData保持静态std::vector@Tadzys,这说明设计很差。在静态对象中存储指针不是一个好主意。你可以想出复杂的逻辑来处理它们,但如果不正确,可以避免它们你可以。改用
std::vector
。@R Sahu,假设getData保存静态std::vector,在析构函数中我想清理这个向量,但是getData()是在构造函数之前调用的(构造函数可能根本不会被调用),所以你会得到泄漏或崩溃。我的具体解决方案是在构造函数中调用getData()(通过这种方式,我将保证在向量析构函数之前调用析构函数)。当然,使用智能指针也有助于避免问题。
#include <iostream>
#include "a.h"
#include "b.h"

static std::string var1= B::Get();

int main(int argc, char** argv)
{
  A a;
  a.Run();
}
class A{
public:
 void Run() {
  getData().push_back(10);
  std::cout << "size: " << getData().size() << std::endl;
 }
private:
 static std::vector<int>& getData();
};

std::vector<int>& A::getData()
{
   static std::vector<int> data;
   return data;
}