1. 程式人生 > >3析構函數分析

3析構函數分析

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析構函數分析