根據變量的作用域(Scope)和其代表對象的生命期(Storage Duration)可將變量分為三種。
非局部變量: 定義在函數之外的變量,如全局作用域中的變量,命名空間作用域中的變量,類的靜態成員變量。
局部靜態變量: 定義在函數內的靜態變量。
局部非靜態變量: 定義在函數內的非靜態變量。
創建
非局部變量在main()函數調用之前創建。
局部靜態變量和局部非靜態變量都在程序第一次執行到變量定義的地方時創建,創建的順序和它們在代碼中的執行順序相同。
銷毀
析構時,變量按照它們構造相反的順序進行。只有已經構造過的那些變量的析構器才有可能被執行。
非局部變量和局部靜態變量的析構發生在main()調用完成之後。
局部非靜態變量的析構發生在程序離開變量所在的作用域之際。
正常情況下,一個C++程序的結束方式有一下幾種:
從main()中返回
調用exit()
調用abort()
拋出一個異常
在程序以從main()中返回結束執行的情況下,已經構造過的各類變量的析構器得以執行。
在調用標准庫中的exit()結束程序的情況下,非局部變量和局部靜態變量(這兩種變量的生命期都持續到程序結束)的析構有機會得到執行。但局部非靜態變量的析構器沒有機會得到執行。
在調用abort()終止程序的情況下,所有變量的析構器沒有機會得到執行。
當有異常拋出,程序轉入異常處理器中的時候,離開的作用域內部的局部非靜態變量的析構器被執行。之後的程序是否結束依賴於異常處理器中的代 碼邏輯,其作用域內的局部非靜態變量,以及storage duration持續到程序結束的那些變量的析構器是否得以執行也可以根據上面的規則再做進一步的判斷。