1. 程式人生 > >C++中的解構函式和delete的關係

C++中的解構函式和delete的關係

https://blog.csdn.net/wk_bjut_edu_cn/article/details/79149540

解構函式

1.建構函式是初始化物件的非static資料成員,在函式體中還可以另外做一些事情;解構函式則是釋放物件使用的資源,並銷燬物件的非static資料成員。

解構函式,沒有返回值,也不接受引數(導致不能被過載),所以對於一個給定的類,只會有一個唯一的建構函式。格式如下:

~A();
  
2.建構函式與解構函式的執行過程區別

在建構函式中,先執行成員的初始化,且按照它們在類中出現的順序進行初始化,然後執行函式體中的內容。在解構函式中,首先執行的是函式體,然後銷燬成員。成員按初始化順序的逆序進行銷燬。所以你要認識到,解構函式體自身並不直接銷燬成員,成員是在解構函式體之後隱含的析構階段中被銷燬的。在整個物件銷燬過程中,解構函式體是作為成員銷燬步驟之外的另一部分進行的。

在一個解構函式中,不存在類似建構函式中初始化列表的東西來控制成員如何銷燬,也就是說,看不見析構的過程是如何進行的。銷燬類型別的成員需要執行成員自己的解構函式。內建型別沒有解構函式,因此,銷燬內建型別成員什麼也不需要做。所以銷燬一個內建指標型別的成員需要我們手動delete。與普通指標不同,智慧指標是類型別,所以具有解構函式,因此智慧指標成員在析構階段會自動銷燬。

3.解構函式在什麼情況下會被呼叫

總的原則就是:當一個物件被銷燬時,就會自動呼叫其解構函式。具體情況如下

①變數在離開其作用域時被銷燬。

②當一個物件被銷燬時,其成員被銷燬。

③容器(包括標準庫容器和陣列)被銷燬時,其元素被銷燬。

④動態分配的物件,當對指向它的指標應用delete運算子時被銷燬。

⑤對於臨時物件,當建立它的完整表示式結束時被銷燬。

delete幹了什麼

delete之後,下次再重新申請的時候可以申請這塊記憶體地址,也就是將這塊地址放到了空閒連結串列上。如果你沒有將p賦為NULL,那麼p指標還是指向這塊記憶體空間。只不過這個位置的記憶體資料已經被毀屍滅跡,此時的這個指標指向的記憶體就是一個垃圾記憶體。但是,別人不知道你已經delete,還以為依舊是合法指標,此時指標已經是“野指標”。

如果不進行delete的話,那麼這塊記憶體是不能在申請使用的,也就是所謂的記憶體洩露。

所以說,delete並不是在刪除指標,而是在清理記憶體。

解構函式和delete的關係

delete用於釋放new在堆中動態生成的物件空間。 釋放時會自動呼叫類的解構函式,在解構函式中用於釋放類內部動態分配的得到的資源。
當然,由於內建型別沒有解構函式,所以delete內建型別指標時,什麼也不需要做。