码迷,mamicode.com
首页 > 编程语言 > 详细

C++编译成功,运行失败之static变量

时间:2016-05-07 07:43:36      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

首先看一段代码:

/////////////////////////////////////////////////////
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;
}

多说一句,这篇不讨论单例模式,有关单例的例子以后再写。

C++编译成功,运行失败之static变量

标签:

原文地址:http://blog.csdn.net/lyg_1102/article/details/51334559

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!