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

首先看一段代码:

/////////////////////////////////////////////////////
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-08-28 11:04:53

C++编译成功,运行失败之static变量的相关文章

static变量生命周期 在php和java中的不同

<%! static class Count { private static int count = 0; public static int getCount(){ count++; return count; } } %> <% out.print(Count.getCount()); %> 通过浏览器连续访问,会分别输出:1,2,3,4,5,6,........ <?php class Count{ private static $count = 0; public

javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题

javac编译成功,用java运行class文件出现"找不到或无法加载主类" 的问题所在很简单 入门就遇到这样的问题,环境变量按网上说的配好了,直接java 和 javac都有提示出来,说明没问题了, 做了一个简单java,放在e盘根目录下,在c:下操作javac该java文件成功了,但用java 该class时却提示"找不到或无法加载主类" ,忙活了半天,找了些资料,发现其实很简单,不是语句错误,是路径问题classpath的问题. 主要是以下两点要注意: 1.在

终于成功编译并且运行了 android源代码 总结一下 遇到的 问题

android 源代码编译真是 好难呀 ,几个月前我曾经编译过但遇到了各种问题,可能是采用ubuntu12.04的原因,这次下载和编译都很顺利.ubuntu采用14.04 在下载前提前进行了hosts设置,我是吧http://laod.cn/hosts/2015-google-hosts.html 这哥们的 hosts整个粘贴到/etc/hosts 文件中的,采用学校校园网下载,不知道用其他网会不会 出问题,上次下载各种 不能访问. 编译的时候也很顺利,直接编译出来了,我 觉得与系统版本有很大关

linux下安装codeblocks及写完程序之后编译成功但无法运行的原因

一:在软件中心输入codeblocks,然后点击安装,等着装完就行了. 再按ctrl+alt+t 打开终端 输入 sudo apt-get install gcc 而后再输入sudo apt-get install g++ 最后打开codeblocks写个 helloworld 试试吧. 二:helloworld小程序写完后,也编译通过了,但是却无法运行,那么你再看看保存的地方吧,要是不是保存在linux下的文档了,而是保存在磁盘里的话就是造成不能运行的结果了,更改保存位置试试看呗. 以上仅是我

相信很多朋友遇到过网站换服务器的问题,或成功或失败!今天3A网络小钱给大家讲的是自己的一个亲身经历,原先小钱有一个网站是在linux服务器上运行,所用的web服务为nginx+mysql+php,但由于服务器到期,新服务器用的是win2008系统,那就需要只能做好迁移! 前期做的准备 1、必须了解自己网站所用的PHP和MySQL的版本 2、网站大小

相信很多朋友遇到过网站换服务器的问题,或成功或失败!今天3A网络小钱给大家讲的是自己的一个亲身经历,原先小钱有一个网站是在linux服务器上运行,所用的web服务为nginx+mysql+php,但由于服务器到期,新服务器用的是win2008系统,那就需要只能做好迁移! 前期做的准备 1.必须了解自己网站所用的PHP和MySQL的版本 2.网站大小 3.数据库大小 由于网站过于巨大90G,而linux服务器上磁盘空间不够无法压缩,最后我选择的办法是使用FTP传,没想到什么好办法. 网站的数据库大

使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?

最近在看APUE,试了上面的一些例子,其中有个例子是使用getpid函数获取进程id,但是在我写demo时,并未引入其所在的头文件unistd.h,结果也能编译成功,也能运行,于是就琢磨下为啥. Environment info: Ubuntu 18.04.2 LTS, gcc (Ubuntu 4.8.5-4ubuntu8) 4.8.5 示意代码如下: int main (int argc, char *argv[]) { long pid = (long)getpid(); long test

VC和gcc在保证函数static变量线程安全性上的区别

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了很大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比较长的时候,很可能给程序带来意想不到的结果.本文从测试代码开始,逐步分析原理,最后给出解决方案. 多线程状态下,VC不能保证在使用函数的静态变量的时候,它的构造函数已经被执行完毕,下面是一段测试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } publ

[hadoop]命令行编译并运行hadoop例子WordCount

首先保证JDK.Hadoop安装设置成功 可以参考[linux]ubuntu下安装hadoop [linux]ubutnu12.04 下安装jdk1.7 使用hadoop版本为1.2.1,jdk为1.7 在hadoop-1.2.1\src\examples\org\apache\hadoop\examples找到WordCount.java 源码如下: 1 /** 2 * Licensed under the Apache License, Version 2.0 (the "License&q

如何成功运行SDL官方提供的Android平台的Demo

如何成功运行SDL官方提供的Android平台的Demo 作者:雨水  日期:2014-4-30 编写说明:SDL的官方提供了一个Anroid的demo模板SDLActivity,无法直接运行,按照官方的文档操作过程中也会遇到很多问题,这里把我成功编译并运行的过程记录下来,希望对大家有所帮助! SDL简介:SDL是Simple DirectMedia Layer的缩写,它是一套开源的C语言跨平台多媒体开发库,提供了多种控制图像,声音等接口,广泛用于游戏,媒体播放器,模拟器开发等. 基本环境: 1