本文發表於2023年10月份的c/c++ users journal, 17(10)
1.為什麼稱它為「自動」指標?
auto_ptr只是眾多可能的智慧型指標之一。許多商業庫提供了更複雜的智慧型指標,用途廣泛而令人驚異,從管理引用的數量到提供先進的**服務。可以把標準c++ auto_ptr看作智慧型指標的ford escort(elmar注:可能指福特的一種適合家居的車型):乙個簡易、通用的智慧型指標,它不包含所有的小技巧,不像專用的或高效能的智慧型指標那麼奢華,但是它可以很好的完成許多普遍的工作,它很適合日常性的使用。
auto_ptr所做的事情,就是動態分配物件以及當物件不再需要時自動執行清理。這裡是乙個簡單的**示例,沒有使用auto_ptr所以不安全:
我們大多數人每天寫類似的**。如果f()函式只有三行並且不會有任何意外,這麼做可能挺好的。但是如果f()從不執行delete語句,或者是由於過早的返回,或者是由於執行函式體時丟擲了異常,那麼這個被分配的物件就沒有被刪除,從而我們產生了乙個經典的記憶體洩漏。
能讓示例1(a)安全的簡單辦法是把指標封裝在乙個「智慧型的」類似於指標的物件裡,這個物件擁有這個指標並且能在析構時自動刪除這個指標所指的物件。因為這個智慧型指標可以簡單的當成乙個自動的物件(這就是說,它出了作用域時會自動毀滅),所以很自然的把它稱之為「智慧型」指標:
現在**不會洩漏t型別的物件,不管這個函式是正常退出還是丟擲了異常,因為pt的析構函式總是會在出棧時被呼叫。清理會自動進行。
最後,使用乙個auto_ptr就像使用乙個內建的指標一樣容易,而且如果想要「撤銷」資源,重新採用手動的所有權,我們只要呼叫release():
最後,我們可以使用auto_ptr的reset()函式來重置auto_ptr使之擁有另乙個物件。如果這個auto_ptr已經擁有了乙個物件,那麼,它會先刪除已經擁有的物件,因此呼叫reset()就如同銷毀這個auto_ptr,然後新建乙個並擁有乙個新物件:
順便貼乙個程式設計思想上的**,裡面智慧型指標主要是為防止類建構函式丟擲異常後析構函式不呼叫造成懸空指標
使用注意事項:
使用智慧型指標要注意其使用的作用域,離開作用域智慧型指標會銷毀,也會delete掉包含的指標,可以使用release()取消包含的指標
C 之智慧型指標
c 中有四個智慧型指標 auto ptr,shared ptr,weak ptr,unique ptr,其中後三個是c 11支援,並且第乙個已經被c 11棄用。智慧型指標從書面意思來說,就是智慧型。主要是動態記憶體的使用很容易出問題,要在正確的時間正確釋放記憶體是很困難的。有時我們可能忘了釋放記憶體...
c 之智慧型指標
設計出乙個class像指標,但是功能更強大,分為兩種形式一種是標準庫的源 早期的指標,多半是過載 和 第二種是迭代器的智慧型指標 1.早期的智慧型指標 templateclass shared ptr t operator const shared ptr t p px p private t px...
C 之「智慧型指標」
1.引入 要確保用 new 動態分配的記憶體空間在程式的各條執行路徑都能被釋放是一件麻煩的事情。c 11 模板庫的 標頭檔案中定義的智慧型指標,即 shared ptr 模板,就是用來部分解決這個問題的。只要將 new 運算子返回的指標 p 交給乙個 shared ptr 物件 託管 就不需要再單獨...