[英]singleton pattern and std::unique_ptr
std::unique_ptr
唯一地控制它指向的對象,因此不使用引用計數。 單例確保只能使用引用計數創建一個對象。
那么std::unique_ptr
與單身人士完全相同嗎?
單例只能確保一個類型的實例 。
unique_ptr
只確保一個指向任何實例的智能指針 。
那么std :: unique_ptr會與單身人士完全相同嗎?
不,讓我們說我們有Foo課程,打算成為單身人士。 使用典型的單例模式,無法構造多個Foo。
有一個std::unique_ptr<Foo>
意味着會有一個指向Foo特定實例的指針,但這並不會阻止創建其他Foo實例(使用其他unique_ptr
或使用指向局部變量的原始指針)。 因此,Foo,不會是單身人士。
std::unique_ptr
通過僅提供移動構造函數而不提供復制構造函數或賦值運算符來實現單個所有權語義。
它根本不是單例的情況,因為您可以有多個unique_ptrs
引用相同類型的不同實例。 單例不允許您直接構造類型,但提供管理唯一實例的訪問器。
此外,德魯的斷言
“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
無關的相同原始指針/資源。 完全取決於使用代碼來定義其資源和智能指針實例的所有權和生命周期策略
如果我錯了,請糾正我,但據我記得,singelton是一個只能有一個實例的類。 那是完全不同的。 所以不行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.