我一直在使用C++一段時間,我仍然不太願意使用智能指針,而且我只在編輯使用它們的代碼時才使用它們,從來沒有在我自己的代碼中使用它(它可能是值得說我是學生)。如何使用C++智能指針?
你能解釋什麼是智能指針的類型,它們是如何工作的以及何時使用它們?
另外,在其他人寫的接口中接收或傳遞原始指針時,「協議」是什麼?
謝謝。
我一直在使用C++一段時間,我仍然不太願意使用智能指針,而且我只在編輯使用它們的代碼時才使用它們,從來沒有在我自己的代碼中使用它(它可能是值得說我是學生)。如何使用C++智能指針?
你能解釋什麼是智能指針的類型,它們是如何工作的以及何時使用它們?
另外,在其他人寫的接口中接收或傳遞原始指針時,「協議」是什麼?
謝謝。
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文檔,並注意他們有這樣的指針容器呢!)
此外,什麼是「協議」接收或傳遞原始指針被其他人寫的接口時, ?
對我來說最重要的規則是:
好總結。我不同意auto_ptr充滿了問題。如果yuo不明白它的作用,那麼它可能會讓你感到意外,但通過閱讀文檔可以解決這個問題。另外,新的C++ 0x提供了std :: unique_ptr,它實際上是替代auto_ptr的下降,但是使得移動語義對新手來說更加明顯。看到哪些已被包含到新的標準庫中也是很好的。 – 2010-08-14 16:36:55
授予。我有點苛刻,我們會繼續使用'auto_ptr'(儘管我的草稿副本,即n3090表示它已被棄用)。 – dirkgently 2010-08-14 17:10:36
調用助推文檔「優秀」是有點拉伸:)。質量上升和下降,取決於有問題的庫。但一般來說,好的答案是+1。 – Lucas 2010-08-14 18:24:39
關於STL auto_ptr,我推薦閱讀Herb Sutter's(好C++書籍的作者)GuruOfTheWeek:使用這個Link
智能指針類型是一個抽象層,用於自動執行分配和釋放內存的過程,它們的構造函數通過獲取已分配的內存(通過指針)及其析構函數釋放分配的內存。當然,構造函數和析構函數可以內聯(因此沒有開銷來調用它們)。例如:
{
int* raw = new int(40);
auto_ptr<int> sp(raw); //inline constructor: internal_holder = raw
//...
//inline destructor: delete internal_holder
}
在C++中,很好地間接使用指針(將它們隱藏在類的後面)。創建新智能指針的開銷可以忽略不計。但shared_ptr由於其計數引用的行爲而更加重要(它是引用計數)。
當我們想使用從別人寫的其他函數接收到的原始指針時,如果這個原始指針不應該被我們自己釋放,那麼我們就不應該使用智能指針。
沒有關於何時使用智能指針的規則。更合適的是,您儘可能使用智能指針。原始指針在寫得很好的C++代碼中是罕見的。當您收到一個原始指針時,如果您有責任釋放它,則將其封裝在一個自我釋放的自定義寫入智能指針中。
要完成答案和即將推出的C++ 0x標準的答案。這些鏈接舉例說明何時以及如何使用它們。它還記錄了shared_ptr和weak_ptr之間的關係。
http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr
http://www2.research.att.com/~bs/C++0xFAQ.html#std-weak_ptr
http://www2.research.att.com/~bs/C++0xFAQ.html#std-unique_ptr
在這個非常站點A小的搜索爲您提供以下 http://stackoverflow.com/search?q=smart+pointers – celavek 2010-08-14 16:14:31
許多不同的可能的重複對這個問題... – 2011-11-20 01:02:40