標籤:
通常,我們為了使自己的程式結束,會在主函數中使用return或調用exit()。在windows下還有ExitProcess()和TerminateProcess()等函數。
本文的目的是比較以上幾種結束程式的方式的區別,並分析其原理。
首先我們用一個例子來說明幾種結束方式的區別。
測試代碼如下:
#include
#include
#include
class Test
{
public:
Test (int i) {m_i=i; printf ("construct %d\n", m_i);};
~Test () {printf ("destruct %d\n", m_i);};
private:
int m_i;
};
Test t_1 (1);
int main(int argc, char* argv[])
{
Test t_2 (2);
printf("Hello World!\n");
// return 0;
// exit (0);
// ExitProcess (0);
}
我們的目標是察看兩種結束方式有什麼不同。
程式在啟動並執行結果為:
使用return 0結束時:
construct 1
construct 2
Hello World!
destruct 2
destruct 1
使用exit (0)結束時:
construct 1
construct 2
Hello World!
destruct 1
使用ExitProcess (0)結束時:
construct 1
construct 2
Hello World!
從結果上我們可以看出來,採用return來結束進程可以正確的析構全域和局部對象。而採用exit()來結束進程時全域對象可以正確析構,但局部對象沒有正確析構。採用ExitProcess(0)結束時全域和局部對象都沒有正確析構。
為什麼會出現這樣的情況呢?
《Windows核心編程》中我們可以得到以下解釋:
"當主線程的進入點函數(WinMain、wWinMain、main或wmain)返回時,它將返回給C/C++運行期啟動代碼,它能夠正確地清楚該進程使用的所有C運行期資源。當C運行期資源被釋放之後,C運行期啟動代碼就顯式的調用ExitProcess,並將進入點函數返回的值傳遞給它。"
在Windows下,return 0 的實際執行過程是:
所以,ExitProcess不負責任何對象的析構,exit只負責析構全域對象,return 0可以析構局部對象並調用exit,因此能析構全部對象。
Windows下return,exit和ExitProcess的區別和分析