2013-04-09 79 views
5

std::unique_ptr唯一地控制它指向的對象,因此不使用引用計數。單例確保只有一個對象可以利用引用計數創建。singleton pattern and std :: unique_ptr

然後std::unique_ptr與單身人士完全相同嗎?

+5

我不明白你是如何得出這個結論的! – 2013-04-09 15:47:10

+3

那麼,可以有一個'std :: unique_ptr '的任意數量的實例... ... – juanchopanza 2013-04-09 15:48:34

+0

@sftrabbit我以某種錯位的方式混淆了'singleton'和'std :: unique_ptr'的原理。謝謝大家提供澄清。 – Mushy 2013-04-09 15:55:29

回答

11

單身人士確保只有一個實例的一種類型。

A unique_ptr確保只有一個智能指針到任何實例。

+0

你的第二個陳述不一定是正確的。 – 2013-04-09 15:59:26

+0

@PreetKukreti我同意你的回答。我可能是我自己最大的敵人,並斷言我的第一個陳述也不一定是真實的。您可以利用錯誤代碼來複制。考慮我使用「確保」意味着「採取措施來幫助確保」。 *或許我應該編輯... * – 2013-04-09 16:02:48

+0

無後顧之憂,無論如何,我投票給你,你很簡潔地描述一般的想法:) – 2013-04-09 16:05:21

0

糾正我,如果我錯了,但據我記得singelton是一個只能有一個實例的類。這完全不同。所以不行。

5

那麼std :: unique_ptr的執行方式與單例相同嗎?

不是。比方說,我們有Foo這個班,打算成爲一個單身人士。使用典型的單例模式,沒有辦法構建多個Foo。

擁有std::unique_ptr<Foo>意味着將有一個指向特定Foo實例的指針,但這並不妨礙創建Foo的其他實例(或者使用其他unique_ptr或原指向局部變量的指針)。因此,Foo,不會是一個單身人士。

+0

不錯的插圖,但我認爲你的意思是'unique_ptr',而不是'shared_ptr'? – 2013-04-09 15:53:02

+0

是的,我輸錯了。感謝編輯。 – 2013-04-09 21:30:01

3

std::unique_ptr通過僅提供移動構造函數並且沒有複製構造函數或賦值運算符來實現單一所有權語義。

它不是一個單例的情況,因爲你可以有多個unique_ptrs引用同一類型的不同實例。單例不會讓你直接構造類型,而是提供一個管理唯一實例的訪問器。

此外,德魯的說法,

「A的unique_ptr確保只有一個智能指針到任何實例。」

是錯誤的。如果你簡單地做:

T* nt = new T; 
std::unique_ptr<T> up1(nt); 
std::unique_ptr<T> up2(nt); 

那麼你有兩個擁有相同資源的唯一指針 - 你會發現只有在運行時間的問題,而不是編譯時間。當然,這是unique_ptr的不正確使用,但是這強化了unique_ptr不能確保你做任何事情,它只是一個指針容器,它從它自己的角度來看擁有唯一的所有權,並且通過它的api,使得很難意外創建臨時副本。

此外,您可以將其他(智能)指針類型指向獨立於任何unique_ptr的原始指針/資源。完全取決於使用代碼來定義其資源和智能指針實例的所有權和生命週期策略