3析構函數分析
阿新 • • 發佈:2017-07-24
cdb 變量作用域 執行 函數分析 nbsp 定義 不同 調用 大於
設已經有ABCD4個類的定義,程序中ABCD析構函數的調用順序是什麽?B
C c; void main() { A *pa=new A(); B b; static D d; delete pa; }
A 、ABCD B、 ABDC C 、ACDB D 、ACBD
分析:根據析構函數先構造的就最後析構,從程序中可以看到先構造出C類的c,所以最後析構C類的c。由此可以選擇B。
這道題主要考察的知識點是 :全局變量,靜態局部變量,局部變量空間的堆分配和棧分配
其中全局變量和靜態局部變量時從 靜態存儲區中劃分的空間,
二者的區別在於作用域的不同,全局變量作用域大於靜態局部變量(只用於聲明它的函數中),
而之所以是先釋放 D 在釋放 C的原因是, 程序中首先調用的是 C的構造函數,然後調用的是 D 的構造函數,析構函數的調用與構造函數的調用順序剛好相反。
局部變量A 是通過 new 從系統的堆空間中分配的,程序運行結束之後,系統是不會自動回收分配給它的空間的,需要程序員手動調用 delete 來釋放。
局部變量 B 對象的空間來自於系統的棧空間,在該方法執行結束就會由系統自動通過調用析構方法將其空間釋放。
之所以是 先 A 後 B 是因為,B 是在函數執行到 結尾 "}" 的時候才調用析構函數, 而語句 delete a ; 位於函數結尾 "}" 之前。
3析構函數分析