Windows下return,exit和ExitProcess的區別和分析

來源:互聯網
上載者:User

標籤:

通常,我們為了使自己的程式結束,會在主函數中使用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 的實際執行過程是: 

  • 先析構main函數內的局部對象。

  • 返回至調用main的函數。

  • 調用exit函數,由exit函數調用doexit函數,在doexit函數中完成對全域對象的析構。

  • 最後調用ExitProcess結束進程。

  •  

  •  

  •  

所以,ExitProcess不負責任何對象的析構,exit只負責析構全域對象,return 0可以析構局部對象並調用exit,因此能析構全部對象。

Windows下return,exit和ExitProcess的區別和分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.