2010-08-14 82 views
11

我一直在使用C++一段時間,我仍然不太願意使用智能指針,而且我只在編輯使用它們的代碼時才使用它們,從來沒有在我自己的代碼中使用它(它可能是值得說我是學生)。如何使用C++智能指針?

你能解釋什麼是智能指針的類型,它們是如何工作的以及何時使用它們?

另外,在其他人寫的接口中接收或傳遞原始指針時,「協議」是什麼?

謝謝。

+1

在這個非常站點A小的搜索爲您提供以下 http://stackoverflow.com/search?q=smart+pointers – celavek 2010-08-14 16:14:31

+0

許多不同的可能的重複對這個問題... – 2011-11-20 01:02:40

回答

15

C++ 98不提供除auto_ptr之外的任何智能指針,它們充滿了它自己的問題。 C++ 0X試圖通過引入更多的品種(shared_ptr,unique_ptr等)來解決這個問題。與此同時,最好的選擇是使用Boost。看看你可以使用的各種口味here。 Boost是社區驅動的,經過廣泛測試,當然免費。有很好的文檔和示例代碼,可以幫助您入門。

你能解釋一下智能指針的類型,它們是如何工作的以及何時使用它們?

其中有很多。總之:單 對象

scoped_ptr<boost/scoped_ptr.hpp> 簡單的唯一所有權。不可複製。

scoped_array<boost/scoped_array.hpp>簡單鞋底 數組的所有權。不可複製。

shared_ptr<boost/shared_ptr.hpp> 對象所有權之間 多個指針共享。

shared_array <boost/shared_array.hpp>陣列 所有權多個 指針間共享。

weak_ptr <boost/weak_ptr.hpp>非擁有由 一個屬於shared_ptr的對象 觀察員。具有嵌入的 引用計數對象的

intrusive_ptr <boost/intrusive_ptr.hpp>共享 所有權。

(即從Boost文檔,並注意他們有這樣的指針容器呢!)

此外,什麼是「協議」接收或傳遞原始指針被其他人寫的接口時, ?

對我來說最重要的規則是:

  • 常量資格
  • 不解除分配的東西我不分配
  • 檢查所有權轉移/移動語義
+2

好總結。我不同意auto_ptr充滿了問題。如果yuo不明白它的作用,那麼它可能會讓你感到意外,但通過閱讀文檔可以解決這個問題。另外,新的C++ 0x提供了std :: unique_ptr,它實際上是替代auto_ptr的下降,但是使得移動語義對新手來說更加明顯。看到哪些已被包含到新的標準庫中也是很好的。 – 2010-08-14 16:36:55

+0

授予。我有點苛刻,我們會繼續使用'auto_ptr'(儘管我的草稿副本,即n3090表示它已被棄用)。 – dirkgently 2010-08-14 17:10:36

+0

調用助推文檔「優秀」是有點拉伸:)。質量上升和下降,取決於有問題的庫。但一般來說,好的答案是+1。 – Lucas 2010-08-14 18:24:39

0

關於STL auto_ptr,我推薦閱讀Herb Sutter's(好C++書籍的作者)GuruOfTheWeek:使用這個Link

1

智能指針類型是一個抽象層,用於自動執行分配和釋放內存的過程,它們的構造函數通過獲取已分配的內存(通過指針)及其析構函數釋放分配的內存。當然,構造函數和析構函數可以內聯(因此沒有開銷來調用它們)。例如:

{ 
    int* raw = new int(40); 
    auto_ptr<int> sp(raw); //inline constructor: internal_holder = raw 
    //... 
    //inline destructor: delete internal_holder 
} 

在C++中,很好地間接使用指針(將它們隱藏在類的後面)。創建新智能指針的開銷可以忽略不計。但shared_ptr由於其計數引用的行爲而更加重要(它是引用計數)。

當我們想使用從別人寫的其他函數接收到的原始指針時,如果這個原始指針不應該被我們自己釋放,那麼我們就不應該使用智能指針。

0

沒有關於何時使用智能指針的規則。更合適的是,您儘可能使用智能指針。原始指針在寫得很好的C++代碼中是罕見的。當您收到一個原始指針時,如果您有責任釋放它,則將其封裝在一個自我釋放的自定義寫入智能指針中。