1. 程式人生 > >main函式執行前、後再執行的程式碼

main函式執行前、後再執行的程式碼

http://blog.csdn.net/huang_xw/article/details/8542105

一、main結束 不代表整個程序結束

  (1)全域性物件的建構函式會在main 函式之前執行,
          全域性物件的解構函式會在main函式之後執行;
          用atexit註冊的函式也會在main之後執行。
  (2)一些全域性變數、物件和靜態變數、物件的空間分配和賦初值就是在執行main函式之前,而main函式執行完後,還要去執行一些諸如釋放空間、釋放資源使用權等操作
  (3)程序啟動後,要執行一些初始化程式碼(如設定環境變數等),然後跳轉到main執行。全域性物件的構造也在main之前。
二、main()之後執行的程式碼,用atexit註冊的函式也會在main之後執行

[cpp] view plaincopyprint?
  1. #include <iostream>
  2. void fn1(void)  
  3. {  
  4.     printf("next.\n");   
  5. }  
  6. void fn2(void)  
  7. {  
  8.     printf("executed ");   
  9. }  
  10. void fn3(void)  
  11. {  
  12.     printf("is ");   
  13. }  
  14. void fn4(void)  
  15. {  
  16.     printf("This ");  
  17. }   
  18. int main(void)  
  19. {  
  20.     // 
  21.     // 註冊需要在 main 函式結束後執行的函式.  
  22.     // 請注意它們的註冊順序和執行順序
  23.     // 在 main 函式結束後被呼叫,呼叫順序與註冊順序相反。 先註冊後執行。
  24.     //
  25.     atexit(fn1);  
  26.     atexit(fn2);  
  27.     atexit(fn3);  
  28.     atexit(fn4);  
  29.     // 這條輸出語句具有參照性,它可不是最後一句輸出. 
  30.     puts("This is executed first.");   
  31.     // EXIT_SUCCESS 代表 0,它定義在 stdlib.h 中. 
  32.     // 我只是順便提一下,也許你知道,但我擔心你不知道,呵呵. 
  33.     //
  34.     return
     EXIT_SUCCESS;  
  35. }  
關於atexit函式我的稍微補充一下,原型如下:
[cpp] view plaincopyprint?
  1. int atexit(void (*func)(void));   
   atexit 函式是標準 C 新增的。它“註冊”一個函式,使這個函式將在 exit 函式被呼叫時或者當 mian 函式返回時被呼叫。當程式異常終止時(例如呼叫 abort 或 raise),通過它註冊的函式並不會被呼叫。編譯器必須至少允許程式設計師註冊32個函式。如果註冊成功,atexit 返回0,否則返回非零值。沒有辦法取消一個函式的註冊。在 exit 所執行的任何標準清理操作之前,被註冊的函式按照與註冊順序相反的順序被依次呼叫。每個被呼叫的函式不接受任何引數,並且返回型別是 void。被註冊的函式不應該試圖引用任何儲存類別為 auto 或 register 的物件(例如通過指標),除非是它自己所定義的。多次註冊同一個函式將導致這個函式被多次呼叫。有些傳統 C 編譯器用 onexit 這個名稱實現了像是的功能。
   atexit是註冊後進先出的函式,和函式入棧出棧是一樣的。
   在這裡註冊了四個函式,理解為入棧的順序為fn1() -> fn2() -> fn3() -> fn4();出棧的順序正好相反,而什麼時候出棧呢?就是在呼叫函式結束時,準確的說應該是函式呼叫的最後的操作就是出棧過程。main()同樣也是一個函式,在結束時,按出棧的順序呼叫四個函式,即為fn4() -> fn3() -> fn2() -> fn1();
   註冊這個函式的目的就是為了在函式退出時呼叫的,即使是main()函式也是這樣的。可以在這些函式中加入一些清理工作,比如記憶體釋放等等。

相關推薦

main函式執行執行程式碼

http://blog.csdn.net/huang_xw/article/details/8542105 一、main結束 不代表整個程序結束   (1)全域性物件的建構函式會在main 函式之前執行,           全域性物件的解構函式會在main函式之後執行;

javascript 如何執行完一個函式執行下一個函式

先說結論: 首先,JavaScript是解釋性語言,本來就是順序執行的!! 所以,如果發現有一段js程式碼總是在一段程式碼之前就執行完了,比如說報了null異常,那麼有可能是回撥函式的非同步機制造成的。 此種情形下解決的方法是,把要執行的函式放在回撥函式內部就可以了。 舉個栗子

正確理解使用Vue裡的nextTick方法 (如何在資料或dom渲染結束執行函式或方法)

Vue.nextTick(callback),當資料發生變化,更新後執行回撥。 Vue.$nextTick(callback),當dom發生變化,更新後執行的回撥。 示例: <ul id="dem

正確理解使用Vue裡的nextTick方法 (如何在資料或dom渲染結束執行函式或方法)

Vue.nextTick(callback),當資料發生變化,更新後執行回撥。 Vue.$nextTick(callback),當dom發生變化,更新後執行的回撥。 示例: <ul id="demo"> <li v-for="item in list"&

關於IDLE的使用筆記(一)--輸入多行語句(或函式執行

在Python自帶的IDLE中,如果編輯一個函式或輸入多行語句後,如何繼續執行? 例如,編輯如下程式碼: 此時如果直接回車,輸入例如 print_lol(xxx)準備執行程式碼,會報錯,提示print_lol未定義。 因為此時多行編輯還沒有完成。如何做? 只需

沒有main函式時的Java程式的執行

Java初學者大都是從main函式在控制檯列印HelloWorld來開始Java學習的, 其形式為:public static void main(String[ ] arg)。 首先,main方法是JVM(java虛擬機器)自動呼叫,JVM呼叫main方法的位置自然不會在某個類中、或某個包中,

C# 本程序執行完畢執行下一執行

  最近做了一套MES整合系統,由上料到成品使自動化執行,其中生產過程是逐步的,但是每一個動作都需要獨立的執行緒進行資料監聽,那麼就需要實現執行緒等待。 程式碼: using System; using System.Collections.Generic; using System.Compone

C# 本進程執行完畢執行下一線程

pda lag initial process orm threading 監聽 message tasks   最近做了一套MES集成系統,由上料到成品使自動化運行,其中生產過程是逐步的,但是每一個動作都需要獨立的線程進行數據監聽,那麽就需要實現線程等待。 代碼: us

【軟體開發底層知識修煉】十 連結器-main函式不是第一個被執行函式

上一篇文章,大概瞭解了連結器的工作內容就是:符號解析和重定位。點選上一篇文章檢視:點選檢視。 本片文章其實還是圍繞連結器來學習。只不過不是很明顯,當你學到下一篇文章時,就明白了。 本篇文章來弄明白一個問題:在C/C++程式被載入到記憶體中準備執行時,main函式是第一個被執行的函

執行執行時,如果一個邏輯需要等若干個執行執行完成執行,怎麼實現?

實際開發過程中,尤其是大型的業務系統中或批量處理系統中,我們通常會用到多執行緒來進行任務拆分,來提高系統的處理能力。當對業務不斷拆分時,多執行緒各自任務之間也形成了錯綜複雜的關係。 我們常常遇到這樣的情況,業務模組A 拆分成了 A1 、A2.....An個多執行緒,來提高處理速度,可是 Ak(1<k&

Java Thread.join()詳解--父執行緒等待子執行緒結束結束

一、使用方式。 join是Thread類的一個方法,啟動執行緒後直接呼叫,例如: ? 1 Thread t = new AThread(); t.start(); t.join();

java 主執行緒等待子執行執行執行

這裡記錄一下下面這種情況:主執行緒需要等待多個子執行緒執行完後再執行。 我們先看一下下面的場景: package com.java4all.mypoint; import java.util.concurrent.CountDownLatch; /*

java如何在多執行執行完成執行某個方法

package com.whj.feign.client; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concur

Java實現獲取N天日期的函式分享

public Date getdate(int i) // //獲取前後日期 i為正數 向後推遲i天,負數時向前提前i天 { Date dat = null; Calendar cd = Calendar.getInstance(); cd.add(Calendar

Node.js的那些坑(三)——如何在非同步方法都執行執行

序 在非同步方法執行後再執行的直接解決方案就是寫回調。 可是如果想讓所有的(例如迴圈呼叫的若干次)非同步方法全部執行完之後再執行接下來的方法該怎麼辦呢? 本文基於Promise語法,給出解決方案。 接著上一篇的例子,我們先來看一下有問題的寫法。 有問題的寫法: v

jquery $.when()多個非同步請求成功執行後續方法

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) { // a1 and a2 are arguments resolved for the page1 and

如何等到巢狀的block執行執行其他程式碼

現在有一個單例 Manage.h、Manage.m  裡面有你封裝的一個請求伺服器資料的方法。 例如:-(void)manageRequestWithUrl:(NSURL*)urlName handleBlock(void(^)(NSData *data,NSError*

java開啟多個執行緒,執行完成執行執行

博主昨天去一家公司面試,被面試官問到一個問題,如果開啟10個執行緒,但是需要這10個執行緒都執行完成後,再交由主執行緒統一輸入,如何實現?當時我沒有回答,我對多執行緒並不是那麼的熟悉,面試結束後,我通過查閱資料找到了解決方案,下面我貼出程式碼: i

iOS 中使用GCD怎麼讓兩個執行執行完結束執行另一個執行

//利用GCD並行多個執行緒並且等待所有執行緒結束之後再執行其它任務 dispatch_group_t group = dispatch_group_create(); dispatch_group_

AngularJs資料渲染到檢視執行操作

return{ restrict:'A', link:function(scope,ele,attrs){ var timeout=$timeout(function(){ lazyloadI