![](/img/trans.png)
[英]Why unique_ptr with custom deleter won't work for nullptr, while shared_ptr does?
[英]Why does unique_ptr have the deleter as a type parameter while shared_ptr doesn't?
std::unique_ptr
模板有兩個參數:指針的類型和刪除器的類型。 第二個參數有一個默認值,所以你通常只寫std::unique_ptr<int>
之類的東西。
std::shared_ptr
模板只有一個參數:指針的類型。 但是您也可以使用自定義刪除器,即使刪除器類型不在類模板中。 通常的實現使用類型擦除技術來做到這一點。
std::unique_ptr
沒有使用相同的想法是否有原因?
部分原因是shared_ptr
無論如何都需要一個顯式的控制塊用於引用計數並且保留一個刪除器並不是最重要的交易。 然而, unique_ptr
不需要任何額外的開銷,並且添加它將是不受歡迎的 - 它應該是一個零開銷類。 unique_ptr
應該是靜態的。
如果你想要這樣的行為,你總是可以在頂部添加你自己的類型擦除 - 例如,你可以擁有unique_ptr<T, std::function<void(T*)>>
,這是我過去所做的。
除了DeadMG指出的另一個原因之外,另一個原因是它可以編寫
std::unique_ptr<int[]> a(new int[100]);
和~unique_ptr
將調用正確的delete
版本(通過default_delete<_Tp[]>
),這要歸功於T
和T[]
專用。
來自C++ Primer(第 5 版)<\/strong><\/em> ,第 16.1.6 章 - 效率和靈活性
shared_ptr 和 unique_ptr 之間的明顯區別在於它們在管理所持有的指針時使用的策略——一個類給了我們共享所有權; 另一個擁有它持有的指針。 這種差異對於這些類的作用至關重要。
這些類在讓用戶覆蓋其默認刪除器的方式上也有所不同。 我們可以通過在創建或重置指針時傳遞一個可調用對象來輕松地覆蓋 shared_ptr 的刪除器。 相反,刪除器的類型是 unique_ptr 對象類型的一部分。 用戶在定義 unique_ptr 時必須提供該類型作為顯式模板參數。 因此,unique_ptr 的用戶提供自己的刪除器更加復雜。
通過在編譯時綁定刪除器,unique_ptr 避免了間接調用其刪除器的運行時成本。<\/strong> 通過在運行時綁定刪除器,shared_ptr 使用戶更容易覆蓋刪除器。<\/strong>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.