全局对象的构造函数会在main函数之前执行?
2016-09-27 22:11
701 查看
#include <iostream> using namespace std; class CTest { public: CTest() { cout << "构造函数..." << endl; } ~CTest() { cout << "析构函数..." << endl; } }; int main() { CTest t; return 0; }
可见:全局对象的构造函数会在main函数之前执行。
在大多数的实现方式里,核心会运行专门的启动代码,启动代码会在启动main()之前完成所有的初始化工作,这其中当然包括了全局对象的初始化。这个所谓的启动代码就是Runtime函数库的Startup代码。
在程序执行时,系统会先调用Startup,完成函数库初始化、进程信息设立、I/O stream产生,以及对static对象的初始化等动作。然后Startup调用main()函数,把控制权交给main()函数。main()函数执行完毕,控制权交回给Startup,进行反初始化动作。
可以看看CRT的代码,里面的CRT初始化过程包含所有全局变量的构造,这些全局变量被编译器放到一个链表中了,CRT初始化时读取链表依次执行回调函数(就是构造函数),然后才执行MAIN入口点函数。
参考: http://blog.csdn.net/huang_xw/article/details/8542105 http://www.programlife.net/msvc-crt-startup.html https://msdn.microsoft.com/en-us/library/bb918180.aspx
#include <iostream>
using namespace std;
class CTest
{
public:
CTest()
{
cout << "构造函数..." << endl;
}
~CTest()
{
cout << "析构函数..." << endl;
}
};
/**
* CTest test;
* 全局对象的析构函数在return执行以后被调用
*/
int main()
{
/**
* CTest test;
* 局部对象的析构函数在return执行以前被调用
*/
/**
* CTest *test = new CTest;
* delete test;
* new生成的对象的析构函数在delete执行以后调用
*/
/**
* static CTest test;
* 局部静态对象的析构函数在return执行以后被调用
*/
{
/**
* CTest test;
* test离开此作用域就会调用析构函数
*/
}
return 0;
}
相关文章推荐
- 全局对象的构造函数会在main函数之前执行?
- c++写的os,对于全局对象,构造函数不会执行
- C++综合系列之构造函数执行于main函数之前
- 静态全局对象 构造函数
- C++派生类--基类构造函数,内嵌对象(子对象)的执行顺序
- 如何让一段程序在main函数之前执行
- 如何让一段程序在main函数之前执行的
- 在main函数之前和之后执行一些操作
- 再学Java 基础(3)类与对象【构造函数以及其执行顺序----经典讲解】重点!!!
- C++派生类--基类构造函数,内嵌对象(子对象)的执行顺序
- main函数之前执行代码
- mian函数之前执行函数,和main函数之后执行函数
- 全局对象构造函数的调用时机
- 从开机加电到执行main函数之前的过程(一)
- 从开机加电到执行main函数之前的过程(一)
- C++派生类--基类构造函数,内嵌对象(子对象)的执行顺序
- 构造函数的职责 -- 关于全局变量的构造函数里执行太多复杂操作导致的问题
- 全局对象在程序进入main之前construct, 离开main后destruct
- Cpp深入:就要在main函数之前执行
- 从开机加电到执行main函数之前的过程