天天看點

條款6:析構函數裡對指針成員調用delete

大多數情況下,執行動态記憶體配置設定的的類都在構造函數裡用new配置設定記憶體,然後在析構函數裡用delete釋放記憶體。增加一個指針成員意味着幾乎都要進行下面的工作:

    ·在每個構造函數裡對指針進行初始化。對于一些構造函數,如果沒有記憶體要配置設定給指針的話,指針要被初始化為0(即空指針)。

    ·删除現有的記憶體,通過指派操作符配置設定給指針新的記憶體。

    ·在析構函數裡删除指針。

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

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

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

一種避免必須删除指針成員的方法是把這些成員用智能指針對象來代替,比如c++标準庫裡的auto_ptr。

繼續閱讀