天天看點

析構函數調用順序

牛客上看到了這個問題:

C c;
void main()
{
    A*pa=new A();
    B b;
    static D d;
    delete pa;
}
           

問析構的順序:

全局變量,靜态局部變量,局部變量空間的堆配置設定和棧配置設定

其中全局變量和靜态局部變量時從 靜态存儲區中劃分的空間,

二者的差別在于作用域的不同,全局變量作用域大于靜态局部變量(隻用于聲明它的函數中),

而之是以是先釋放 D 在釋放 C的原因是, 程式中首先調用的是 C的構造函數,然後調用的是 D 的構造函數,析構函數的調用與構造函數的調用順序剛好相反。

局部變量A 是通過 new 從系統的堆空間中配置設定的,程式運作結束之後,系統是不會自動回收配置設定給它的空間的,需要程式員手動調用 delete 來釋放。

局部變量 B 對象的空間來自于系統的棧空間,在該方法執行結束就會由系統自動通過調用析構方法将其空間釋放。

之是以是 先 A 後 B 是因為,B 是在函數執行到 結尾 “}” 的時候才調用析構函數, 而語句 delete a ; 位于函數結尾 “}” 之前。

繼續閱讀