條款6 析構函式裡對指標成員呼叫delete

2021-05-26 09:35:27 字數 657 閱讀 5443

大多數情況下,執行動態記憶體分配的的類都在建構函式裡用new分配記憶體,然後在析構函式裡用delete釋放記憶體。增加乙個指標成員意味著幾乎都要進行下面的工作:

·在每個建構函式裡對指標進行初始化。對於一些建構函式,如果沒有記憶體要分配給指標的話,指標要被初始化為0(即空指標)。

·刪除現有的記憶體,通過賦值操作符分配給指標新的記憶體。

·在析構函式裡刪除指標。

如果在建構函式裡忘了初始化某個指標,或者在賦值操作的過程中忘了處理它,問題會出現得很快,但是,如果在析構函式裡沒有刪除指標,它不會表現出很明顯的外部症狀。相反,它可能只是表現為一點微小的記憶體洩露,並且不斷增長,最後吞噬了你的位址空間,導致程式夭折。

另外,刪除空指標是安全的(因為它什麼也沒做)。所以,在寫建構函式,賦值操作符,或其他成員函式時,類的每個指標成員要麼指向有效的記憶體,要麼就指向空,那在你的析構函式裡你就可以只用簡單地delete掉他們,而不用擔心他們是不是被new過。

當然對本條款的使用也不要絕對。例如,你當然不會用delete去刪除乙個沒有用new來初始化的指標,而且,就象用智慧型指標物件時不用勞你去刪除一樣,你也永遠不會去刪除乙個傳遞給你的指標。換句話說,除非類成員最初用了new,否則是不用在析構函式裡用delete的。

一種避免必須刪除指標成員的方法是把這些成員用智慧型指標物件來代替,比如c++標準庫里的auto_ptr。

析構函式 及 指標

第一層是系統認識的變數,比如int,int 這些變數系統會在生存週期結束後自動釋放的,當然,你也可以手動地將其釋放 第二層是指標指向的動態分配的空間,需要呼叫delete函式來釋放 類裡面定義的也無外乎這兩種 為何要寫析構函式?而且一般定義成 virtual 型別?你沒法去訪問類的priviate成...

C 析構函式,This指標,函式鏈

include using namespace std class a public a par new int 20 開闢對空間 for int i 0 i 20 i 初始化堆 par i i cout hello n a int a par new int 20 for int i 0 i 20...

6 物件特性之建構函式和析構函式

物件的初始化和處理也是兩個非常重要的安全問題,c 利用建構函式和析構函式解決上述問題。這兩個函式會被編譯器自動呼叫,如果我們不提供構造和析構,編譯器會提供編譯器提供的建構函式和析構函式是空實現。include using namespace std 物件的初始化和處理 class person pu...