delete和析構函式間的關係及細節

2021-08-08 02:25:36 字數 988 閱讀 3880

個人心得:先看以下**

#include

#include

using namespace std; 

class shape 

~shape() 

}; int main() 

當有那句delete b時,執行結果如圖,

也就是說delete b之後執行了shape的析構函式,而按了任意鍵之後,會立馬閃出乙個析構a來,這說明程式執行完成後,即在a所在的作用域結束後,執行了shape的析構函式

而當沒有delete b時,執行結果如圖

這說明暫時沒有執行b的shape析構函式,按了任意鍵後,跟上面一樣,也只會閃出乙個析構a來,沒有析構b

這說明,直接宣告的物件,比如shape a,即在棧上面的物件,所在作用域結束後,會自動執行析構函式,而new出來的在堆上的物件,不呼叫delete,即使它所在的作用域已經結束,也不會呼叫析構函式,根據另外一篇文章內所述,可能程式結束後,os(作業系統)會**其堆內占用的記憶體,這樣就不知道會幹什麼,會不會呼叫析構了。

delete詳解:首先呼叫析構函式,完成類成員的釋放,比如類成員有vector也指向了堆上的記憶體,就需要在析構函式中同樣使用delete釋放這塊記憶體,或者說它自身處於乙個容器當中,就需要在這個容器中erase它

然後再free掉整個物件的記憶體;

delete b過後,b仍然指向改記憶體,即位址不變,但指標可能為懸垂指標,訪問它可能帶來意想不到的結果,也可能正確訪問,不確定,所以建議delete後,把指標設定成null,後面也可根據指標是否為null判斷是否可用。

delete和析構函式間的關係及細節

原文見 個人心得 先看以下 include include using namespace std class shape 當有那句delete b時,執行結果如圖,而當沒有delete b時,執行結果如圖 這說明,直接宣告的物件,比如shape a,即在棧上面的物件,所在作用域結束後,會自動執行析...

c 中delete和析構函式之間的區別

delete 1.呼叫析構函式,釋放物件中的成員資源 2.歸還物件空間 free 其中在呼叫析構函式的時候,有可能還會對其他物件進行delete,然後呼叫這個物件的析構函式。看這個例子 delete用於釋放new在堆中動態生成的物件空間。釋放時會自動呼叫類的析構函式,在析構函式中用於釋放類內部動態分...

建構函式 析構函式和虛函式的關係

首先明確兩點 建構函式不可能定義為虛函式 虛函式的目的是通過父類引用或者指標呼叫子類的成員函式。而建構函式的目的是建立物件。建立子類物件時,將呼叫子類的建構函式,而不是父類的建構函式。子類的建構函式將使用父類的乙個建構函式。這種順序不同於繼承機制。因此,子類不繼承父類的建構函式,所以將類的建構函式宣...