C++全局和静态变量初始化

转自:http://www.cnblogs.com/zhenjing/archive/2010/10/15/1852116.html

对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内存空间,因此程序结束后全局内存空间被一起回收,不存在变量依赖问题,没有任何代码会再被执行!

  C++引入了对象,这给全局变量的管理带领新的麻烦。C++的对象必须有构造函数生成,并最终执行析构操作。由于构造和析构并非分配内存那么简单,可以相当复杂,因此何时执行全局或静态对象(C++)的构造和析构呢?

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4
 5 class Var {
 6 public :
 7     Var(const string& str)
 8     {
 9         name  = str;
10         cout<<"初始化:"<<name<<endl;
11     }
12
13     ~Var(){}
14
15     void Print()
16     {
17         cout<<"Print:"<<name<<endl;
18     }
19 private:
20     string name;
21 };
22
23 Var VAR1("global var1");
24 static Var Var2("static var2");
25
26 void Func()
27 {
28     static Var var3("Func static var3");
29     var3.Print();
30 }
31
32 int main(int argc, char** argv)
33 {
34     cout<<"Main start..."<<endl;
35     VAR1.Print();
36     Var2.Print();
37     Func();
38
39     cout<<"Main end..."<<endl;
40     system("pause");
41     return 0;
42 }
43
44 //输出
45 //初始化:global var1
46 //初始化:static var2
47 //Main start...
48 //Print:global var1
49 //Print:static var2
50 //初始化:Func static var3
51 //Print:Func static var3
52 //Main end...

采用VS2012 编译的结果是:全局变量和文件域的静态变量都将在main开始之前被初始化;只有函数内的局部静态变量才是在第一次使用才初始化的。

时间: 2024-10-30 19:49:22

C++全局和静态变量初始化的相关文章

java 静态变量初始化顺序

public class Elvis { public static final Elvis INSTANCE = new Elvis(); private final int beltSize; private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR); private Elvis() { beltSize = CURRENT_YEAR - 1930; } public int beltS

4、 C++函数内的静态变量初始化以及线程安全问题

原文:https://www.cnblogs.com/zxjan/p/3538911.html 1. 如果是编译时和加载时初始化, 是不会存在线程安全这个issue的; 因为这两种初始化一定发生在Main函数执行之前, 这个时候尚未进入程序运行空间; 而这些初始化一定是在单线程环境下操作的!  --  都是在执行C Runtime的startup代码中的void mainCRTStartup(void)函数时所在的OS系统加载程序时的主线程空间上发生的! 2. 如果是运行时初始化, 因为无法保证

duilib lib库静态变量初始化问题

Redrain提供的duilib https://github.com/redrains/DuiLib_Redrain 可编译得到静态库,但是存在一个问题:如果将窗口对象作为全局变量使用时,它会依赖于uilib库中的一些全局变量,由于没有确保lib库的变量初始化先于工程中的全局变量,从而导致崩溃. 应该再uilib代码中添加 #pragma init_seg(lib) 以确保lib库中的全局变量先初始化

Java静态方法,静态变量,初始化顺序

1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实例化就已经存在. 方法也可分为实例方法和静态方法.其中,实例方法必须在类实例化之后通过对象来调用,而静态方法可以在类实例化之前就使用.与成员变量不同的是:无论哪种方法,在内存中只有一份——无论该类有多少个实例,都共用同一个方法. 实例方法的调用: ClassA a = new ClassA();  

静态变量初始化顺序

1. 代码 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } span.s1 { font: 12.0px ".Pin

PHP笔记4__函数/全局、静态变量/函数参数/加载函数库/,,

<?php header("Content-type: text/html; charset=utf-8"); echo table(5,5); function table($rows,$cols){ //函数 $str = ''; $str .= '<table border="1" width="800" align="center">'; $str .= '<caption><h1&

转:Java的一道面试题----静态变量初始化过程

public class Test{ private static Test tester = new Test(); //step 1 private static int count1; //step 2 private static int count2 = 2; //step 3 public Test(){ //step 4 count1++; count2++; System.out.println("" + count1 + count2); } public stati

android产品研发(十)--&gt;不使用静态变量保存数据

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内容,具体可根据项目的需求确定各自的网络传输协议.这里可参考android产品研发(九)–>App网络传输协议 而本文讲解的其实并不是一个技术方面,而是一个android产品研发过程中的技巧:尽量不使用静态变量保存核心数据.这是为什么呢?这是因为android的进程并不是安全的,包括applicat

Qt全局宏和变量

Qt全局宏和变量 工作中会用到QT全局函数和宏 现在搜集整理如下 QT_VERSION : (major << 16) + (minor << 8) + patch 检测版本号: QT_VERSION_CHECK(major, minor, patch)((major<<16)|(minor<<8)|(patch)) 当使用命名空间时的一些宏定义: namespace QT_NAMESPACE {} //命名空间定义 # define QT_PREPEND_