C++全局对象的初始化和析构

众所周知,一个应用程序的开始是从main函数开始,到MAIN函数结束。

那么对于下面的程序

1.cpp

class A

{

public:

  A();

 ~A();

}


A g_a;

int main()

{

return 0;
}


2.cpp

A g_a1;


全局对象g_a的初始化是谁去做的,以及他的析构又是有谁执行的。

答案是编译器。

编译器会在每个单元编译的时候,获取每个单元定义的全局变量,然后生成两个函数

_sti(),_std()

这两个函数的代码大致如下

_sti_cpp1()

{

    g_a.A::A();

}


_std_cpp1()

{

    g_a.A::~A();

}


_sti_cpp2()

{

    g_a1.A::A();

}


_std_cpp2()

{

    g_a1.A::~A();

}


C++对于全局变量,通常编译时将其放在程序的data segment,如果程序员没有手动给其赋一个初值的话,那么这个对象(变量)可以获取到起对应的内存,但是内存中的内容都是0。

在C语言中,都是使用常量给全局变量(C语言没有类和对象)赋初值。

但是在C++语言中,由于构造函数不是常量表达式,因此无法用构造函数给全局对象赋初值。

因此才有了编译器自动生成函数用来对全局对象赋初值,注意,这个动作是在程序运行期执行的,而不是类对象的全局变量(如int,char*等类型)的初始化由于可以使用常量表达式,因此在编译器就可以完成赋值动作,编译完后该变量的值已经被赋值好了。

最后,用来给全局对象赋初值和析构的函数在main函数内的一开始以及退出前被调用,如:

int main()

{

     _main();  //其中调用_sti_cpp1();  _sti_cpp2();   

    ......

    ......   //MAIN函数自己的逻辑代码

    _exit();   //_exit中调用_std_cpp1,_std_cpp2

    return;
}

阅读更多

没有更多推荐了,返回首页