首先看一段代码:
/////////////////////////////////////////////////////
class Single
{
public:
Single();
static Single* s_inst;
static std::map<int, int> s_map;
};
Single* s_inst = new Single;
std::map<int, int> Single::s_map;
Single::Single()
{
s_map[4] = 6;
}
上面的代码使用MinGW492和VS2008编译都可以通过,但是运行的时候会报错误。下图是使用MinGW492时的报错截图:
原因就在于类Single中有两个静态成员变量
static Single* s_inst;
static std::map<int, int> s_map;
静态变量一定会在进入main函数之前初始化。
静态变量初始化的先后顺序和定义的先后顺序一致,和声明的先后顺序无关。
定义的顺序是:
Single* s_inst = new Single;
std::map<int, int> Single::s_map;
所以会先进入Single的构造函数,在Single的构造函数中对s_map进行插入操作,而此时s_map并没有初始化。
所以修改方法也很简单,修改静态变量定义的先后顺序:
/////////////////////////////////////////////////////
class Single
{
public:
Single();
static Single* s_inst;
static std::map<int, int> s_map;
};
// s_map before s_inst
std::map<int, int> Single::s_map;
Single* s_inst = new Single;
Single::Single()
{
s_map[4] = 6;
}
多说一句,这篇不讨论单例模式,有关单例的例子以后再写。
时间: 2024-10-31 13:38:09