C++對(duì)象創(chuàng)建和銷毀的時(shí)機(jī)和順序
根據(jù)變量的作用域(Scope)和其代表對(duì)象的生命期(Storage Duration)可將變量分為三種。
非局部變量: 定義在函數(shù)之外的變量,如全局作用域中的變量,命名空間作用域中的變量,類的靜態(tài)成員變量。
局部靜態(tài)變量: 定義在函數(shù)內(nèi)的靜態(tài)變量。
局部非靜態(tài)變量: 定義在函數(shù)內(nèi)的非靜態(tài)變量。
創(chuàng)建
非局部變量在main()函數(shù)調(diào)用之前創(chuàng)建。
局部靜態(tài)變量和局部非靜態(tài)變量都在程序第一次執(zhí)行到變量定義的地方時(shí)創(chuàng)建,創(chuàng)建的順序和它們在代碼中的執(zhí)行順序相同。
銷毀
析構(gòu)時(shí),變量按照它們構(gòu)造相反的順序進(jìn)行。只有已經(jīng)構(gòu)造過的那些變量的析構(gòu)器才有可能被執(zhí)行。
非局部變量和局部靜態(tài)變量的析構(gòu)發(fā)生在main()調(diào)用完成之后。
局部非靜態(tài)變量的析構(gòu)發(fā)生在程序離開變量所在的作用域之際。
正常情況下,一個(gè)C++程序的結(jié)束方式有一下幾種:
從main()中返回
調(diào)用exit()
調(diào)用abort()
拋出一個(gè)異常
在程序以從main()中返回結(jié)束執(zhí)行的情況下,已經(jīng)構(gòu)造過的各類變量的析構(gòu)器得以執(zhí)行。
在調(diào)用標(biāo)準(zhǔn)庫中的exit()結(jié)束程序的情況下,非局部變量和局部靜態(tài)變量(這兩種變量的生命期都持續(xù)到程序結(jié)束)的析構(gòu)有機(jī)會(huì)得到執(zhí)行。但局部非靜態(tài)變量的析構(gòu)器沒有機(jī)會(huì)得到執(zhí)行。
在調(diào)用abort()終止程序的情況下,所有變量的析構(gòu)器沒有機(jī)會(huì)得到執(zhí)行。
當(dāng)有異常拋出,程序轉(zhuǎn)入異常處理器中的時(shí)候,離開的作用域內(nèi)部的局部非靜態(tài)變量的析構(gòu)器被執(zhí)行。之后的程序是否結(jié)束依賴于異常處理器中的代 碼邏輯,其作用域內(nèi)的局部非靜態(tài)變量,以及storage duration持續(xù)到程序結(jié)束的那些變量的析構(gòu)器是否得以執(zhí)行也可以根據(jù)上面的規(guī)則再做進(jìn)一步的判斷。
非局部變量: 定義在函數(shù)之外的變量,如全局作用域中的變量,命名空間作用域中的變量,類的靜態(tài)成員變量。
局部靜態(tài)變量: 定義在函數(shù)內(nèi)的靜態(tài)變量。
局部非靜態(tài)變量: 定義在函數(shù)內(nèi)的非靜態(tài)變量。
創(chuàng)建
非局部變量在main()函數(shù)調(diào)用之前創(chuàng)建。
局部靜態(tài)變量和局部非靜態(tài)變量都在程序第一次執(zhí)行到變量定義的地方時(shí)創(chuàng)建,創(chuàng)建的順序和它們在代碼中的執(zhí)行順序相同。
銷毀
析構(gòu)時(shí),變量按照它們構(gòu)造相反的順序進(jìn)行。只有已經(jīng)構(gòu)造過的那些變量的析構(gòu)器才有可能被執(zhí)行。
非局部變量和局部靜態(tài)變量的析構(gòu)發(fā)生在main()調(diào)用完成之后。
局部非靜態(tài)變量的析構(gòu)發(fā)生在程序離開變量所在的作用域之際。
正常情況下,一個(gè)C++程序的結(jié)束方式有一下幾種:
從main()中返回
調(diào)用exit()
調(diào)用abort()
拋出一個(gè)異常
在程序以從main()中返回結(jié)束執(zhí)行的情況下,已經(jīng)構(gòu)造過的各類變量的析構(gòu)器得以執(zhí)行。
在調(diào)用標(biāo)準(zhǔn)庫中的exit()結(jié)束程序的情況下,非局部變量和局部靜態(tài)變量(這兩種變量的生命期都持續(xù)到程序結(jié)束)的析構(gòu)有機(jī)會(huì)得到執(zhí)行。但局部非靜態(tài)變量的析構(gòu)器沒有機(jī)會(huì)得到執(zhí)行。
在調(diào)用abort()終止程序的情況下,所有變量的析構(gòu)器沒有機(jī)會(huì)得到執(zhí)行。
當(dāng)有異常拋出,程序轉(zhuǎn)入異常處理器中的時(shí)候,離開的作用域內(nèi)部的局部非靜態(tài)變量的析構(gòu)器被執(zhí)行。之后的程序是否結(jié)束依賴于異常處理器中的代 碼邏輯,其作用域內(nèi)的局部非靜態(tài)變量,以及storage duration持續(xù)到程序結(jié)束的那些變量的析構(gòu)器是否得以執(zhí)行也可以根據(jù)上面的規(guī)則再做進(jìn)一步的判斷。
posted on 2012-12-20 14:30 你爸是李剛 閱讀(174) 評(píng)論(0) 編輯 收藏