2012-06-27 71 views
2

不升壓,或其他任何資源生命週期類,包含一個容器將被用作一個共享的指針,但讓我來控制到底發生了共享「資源」的它的生命?我想封裝一個可以交給的對象,但不再需要的時候可以用上下文定義的方式關閉。C++ /升壓共享資源管理像shared_ptr的

例如,我可能希望創建並繞過文件句柄知道當它超出範圍,該文件將被自動關閉,但我不希望刪除的手柄。

我可以實現它自己,但寧可不進入,如果框架已經存在 - 有人已經毫無疑問做得更好。我不能使用boost::shared_ptr,至少不能以正常形式使用,因爲資源在生命結束時不應該被刪除。

+0

什麼版本的升壓您使用的是,你說的沒有'模板的shared_ptr(Y * P,d d);'構造? –

+0

@SteveJessop:我沒有。我擔心我工作的客戶不允許提升。 –

+2

'shared_ptr'的TR1版本也有它。基本上你最初聲明不能使用'boost :: shared_ptr'的原因是不正確的。這個新的原因,客戶不允許它,是更加引人注目的。如果客戶端不允許你使用任何形式的'shared_ptr'(沒有TR1,沒有Boost,沒有C++ 11),那麼你的問題的答案是「是的,有一個智能指針,想要,但你不能使用它「。 –

回答

7

您是否知道std::shared_ptr可以採用自定義的刪除類?這實際上不需要使用「刪除」或「空閒」,但可以很容易地使用其他類型的機制(例如引用計數機制的release等)。

這裏是一個死簡單的例子給你:

std::shared_ptr<FILE> foo(fopen("la", "r"), fclose); 

的缺失者只是需要一個函數,指針類型的shared_ptr套。在這種情況下,當超出範圍時,shared_ptr將爲您關閉文件。 (注意:這不是一個完全合理的實現,因爲沒有檢查錯誤值,這只是一個例子)。

+0

正如其他人所指出的,'shared_ptr'的Boost實現也可以很好地完成這項工作。 – Rook

+0

我現在,謝謝你的例子。 –

3

如果您使用的是支持C++ 11 std::shared_ptr,一個構造函數需要定製的「刪除器」功能的編譯器。這將允許你編寫自己的函數來「釋放」資源。

編輯 - 我忘了std :: shared_ptr實際上是TR1更新到C++,所以如果你的編譯器支持TR1,你應該保持良好狀態。

1

既然你不能使用升壓或在std :: shared_ptr的,你可以寫一個智能指針無論是共享的或獨特之處在於擁有定製刪除。