2010-08-02 191 views
5

我剛剛完成Koenig & Moo的加速C++和章13 & 14他們提出了一些Handle類(簡單的,共享的,引用計數)的想法和實現。手柄與智能指針相同嗎?

這些類包圍了一個原始指針,並將動態對象的分配/釋放從客戶端代碼中抽離出來,以避免原始指針的所有危險,並允許用戶取消引用它們以訪問指向的對象。基本上是一種'更安全'的方式來與原始內存資源進行交互。

這些章節中介紹的類是否基本實現了智能指針?智能指針對我來說還是很新的,但從我瞭解的這些Handle類執行相同的功能。

  1. 這兩者之間有區別嗎?或者它只是同一事物的另一個名稱?
  2. 假設它們在功能上是等價的,實際上這樣的類會永遠是從頭開始編寫的,而不是使用已經制作好的智能指針解決方案嗎?

編輯

我要補充的是,他們在這些章節開發類是模板類,因此他們不會綁定到特定的資源,如它們不是設計,例如特定的文件句柄類。

第一個代碼片段here 7.1中的代碼幾乎就是我所指的章節中的代碼。

回答

6

從您的描述中,它聽起來像一個智能指針。
雖然我個人不會使用術語句柄,因爲它稍微模糊(只需將智能指針稱爲智能指針)。

問:你能從頭開始寫一個智能指針嗎?
答:是的

問:你應該寫自己的智能指針。 A:不是。它比你想象的要複雜得多。即使書中的描述只是掩蓋了更復雜的問題。堅持由知名圖書館提供的標準圖書。

問:處理是什麼意思。
答:它用來表示指向指針的指針。但是這個術語多年來一直不明朗,因爲這個術語已被重複使用。但是你可以把它看作一個指向資源的指針,其中的資源可以被其他方法訪問,在這種情況下,它們的描述是有效的。

問:你應該使用智能指針而不是原始內存。
答:永遠不要使用RAW內存,除非絕對必要(實際上永遠不會),總是將它封裝在管理它的類中。班級是智能指針還是其他類型的對象是一個很好的問題。 std :: vector不被視爲智能指針,但它封裝了一個RAW指針。

問:你應該從業務邏輯中抽象出內存管理:
答:這是一個棘手的問題,有些人可能會不同意。但我會永遠說。一個班級應該做一件事。事情是資源管理或業務邏輯。將這兩條線索結合起來也是無法預料的複雜性。

+0

謝謝!特別欣賞最後兩個問答。我在那個階段,我覺得我不再是新手了,但我錯過了那種具有經驗的更高層次,設計選擇/哲學洞察力。 乾杯。 – MTLPhil 2010-08-02 16:30:38

1

我會說,句柄是一個比智能指針更概括的概念。

考慮,例如,文件句柄。文件句柄可能實際上是一個指向表示打開文件的數據結構的智能指針,但客戶端並不真正將它作爲指針處理,而只是將句柄傳遞給API。

所以,是的,我有幾次寫我自己的句柄類。

+0

我認爲你試圖解決的問題是句柄是* opaque *指針(並且可能或可能不聰明,通常實際上並不是這樣)。 – 2010-08-02 16:16:07

+0

@Ben,是的,這是一個很好的說法。隨意編輯,如果你認爲它需要它。 – djna 2010-08-02 16:22:24

2

如果你會原諒一些隱喻的C++,這種關係就像是:class smart_pointer : public handle;。智能指針是一個句柄,它在句柄和它處理的任何內容之間提供特定的(類似指針的)接口風格。一個不是智能指針的句柄通常會有(至少隱約)類似的操作,但它們的接口可能完全不同。

在某些時候,有人顯然必須編寫智能指針類(es)。同時,這不是輕率承擔的事情。除非你有精確的規格,否則你可能會得到至少一些細節錯誤 - 而且「非常精確的規格」只會降低賠率到50:50左右...

OTOH,它仍然不像設計智能指針那麼糟糕。這在極端情況下往往是棘手的。舉一個明顯的例子,auto_ptr在標準化過程中經過了多次設計和重新設計,但它在現實生活中仍然看不到多少用處,並且已經在C++ 0x中棄用了(取而代之的是std::unique_ptr,它是一個lot的工作,辯論,並沒有少量的實驗和測試)。

+0

我總是爲一些隱喻的C++ :) – MTLPhil 2010-08-02 16:33:23