翻譯:elmar
本文發表於2023年10月份的c/c++ users journal, 17(10)
很多人聽說過標準auto_ptr智慧型指標機制,但並不是每個人都天天使用它。這真是個遺憾,因為auto_ptr優雅地解決了c++設計和編碼中常見的問題,正確地使用它可以生成健壯的**。本文闡述了如何正確運用auto_ptr來讓你的**更加安全——以及如何避免對auto_ptr危險但常見的誤用,這些誤用會引發間斷性發作、難以診斷的bug。
1.為什麼稱它為「自動」指標?
auto_ptr只是眾多可能的智慧型指標之一。許多商業庫提供了更複雜的智慧型指標,用途廣泛而令人驚異,從管理引用的數量到提供先進的**服務。可以把標準c++ auto_ptr看作智慧型指標的ford escort(elmar注:可能指福特的一種適合家居的車型):乙個簡易、通用的智慧型指標,它不包含所有的小技巧,不像專用的或高效能的智慧型指標那麼奢華,但是它可以很好的完成許多普遍的工作,它很適合日常性的使用。
auto_ptr所做的事情,就是動態分配物件以及當物件不再需要時自動執行清理。這裡是乙個簡單的**示例,沒有使用auto_ptr所以不安全:
// 示例 1(a): 原始**
//void f()
我們大多數人每天寫類似的**。如果f()函式只有三行並且不會有任何意外,這麼做可能挺好的。但是如果f()從不執行delete語句,或者是由於過早的返回,或者是由於執行函式體時丟擲了異常,那麼這個被分配的物件就沒有被刪除,從而我們產生了乙個經典的記憶體洩漏。
能讓示例1(a)安全的簡單辦法是把指標封裝在乙個「智慧型的」類似於指標的物件裡,這個物件擁有這個指標並且能在析構時自動刪除這個指標所指的物件。因為這個智慧型指標可以簡單的當成乙個自動的物件(這就是說,它出了作用域時會自動毀滅),所以很自然的把它稱之為「智慧型」指標:
// 示例 1(b): 安全**, 使用了auto_ptr
//void f()
// 酷: 當pt出了作用域時析構函式被呼叫,
// 從而物件被自動刪除
現在**不會洩漏t型別的物件,不管這個函式是正常退出還是丟擲了異常,因為pt的析構函式總是會在出棧時被呼叫。清理會自動進行。
最後,使用乙個auto_ptr就像使用乙個內建的指標一樣容易,而且如果想要「撤銷」資源,重新採用手動的所有權,我們只要呼叫release():
// 示例 2: 使用乙個 auto_ptr
//void g()
// pt2不再擁有任何指標,所以不要
// 試圖刪除它...ok,不要重複刪除
最後,我們可以使用auto_ptr的reset()函式來重置auto_ptr使之擁有另乙個物件。如果這個auto_ptr已經擁有了乙個物件,那麼,它會先刪除已經擁有的物件,因此呼叫reset()就如同銷毀這個auto_ptr,然後新建乙個並擁有乙個新物件:
// 示例 3: 使用reset()
//void h()
// 最後,pt出了作用域,
// 第二個t也被刪除了
(待續)
有效運用auto ptr
翻譯 elmar 本文發表於1999年10月份的c c users journal,17 10 很多人聽說過標準auto ptr智慧型指標機制,但並不是每個人都天天使用它。這真是個遺憾,因為auto ptr優雅地解決了c 設計和編碼中常見的問題,正確地使用它可以生成健壯的 本文闡述了如何正確運用au...
auto ptr在函式引數和返回值的運用
auto ptr在函式引數和返回值的運用 黃國強 2009 7 28 先看4個函式定義 1 csample func csample2 p 2 csample func std auto ptrp 3 std auto ptrfunc csample2 p 4 std auto ptrfunc st...
AUTO PTR使用總結
標準auto ptr智慧型指標機制很多人都知道,但很少使用它。這真是個遺憾,因為auto ptr優雅地解決了c 設計和編碼中常見的問題,正確地使用它可以生成健壯的 本文闡述了如何正確運用auto ptr來讓你的 更加安全 以及如何避免對auto ptr危險但常見的誤用,這些誤用會引發間斷性發作 難以...