全局對象的構造函數會在main函數之前執行?


#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;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM