全局对象的构造函数会在main函数之前执行?
2023-09-27 14:26:12 时间
#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; }
相关文章
- vue 所有对象介绍
- 【学堂上新】Unity UGUI 渲染 3D 对象详解
- 地球引擎中级教程——地球引擎对象(含练习)
- ES6常用对象操作整理
- Python_Numpy库的Ndarray对象有哪些数据类型?数值范围分别为多少?
- 将Json数据转换为ADO.NET DataSet对象
- 《C++多线程编程实战》——1.3 程序结构、执行流和运行时对象
- DOM= Document Object Model,文档对象模型---以对象管理组织(OMG)的规约为基础的
- Rx编程的第一步是将native对象转换为monad对象
- SwiftUI CloudKit 核心对象与组件之 10 CKDiscoverUserIdentitiesOperation
- @Springboot搭建项目controller层接收json格式的对象失败
- JS 之Blob 对象类型
- 上传文件时,将file对象,经过Qs.stringfly处理后,file文件被过滤
- [Oracle]坏块处理:确认坏块的对象
- 【Unity】动作游戏开发实战详细分析-10-对象池编写