2015-03-02 59 views
2

我讀的書[C++標準庫第二版],發現以下部分的類型:大約原始指針的內部的unique_ptr

namespace std { 
template <typename T, typename D> 
class unique_ptr<T[], D> 
{ 
public: 
typedef ... pointer; // may be D::pointer 
typedef T element_type; 
typedef D deleter_type; 
... 
}; 
} 

,使得唯一的指針擁有的元素類型T可能是無效的具有未指定 類型的對象,如void *那樣。還要注意定義了一個類型指針,它不一定定義爲 T *。如果刪除者D具有指針typedef,則將使用此類型。在這種情況下, 模板參數T具有型標籤的唯一的影響,因爲沒有成員作爲 類的unique_ptr <>依賴於T的一部分;一切都取決於指針。 好處是,unique_ptr因此可以保存其他智能指針。

我讀完本節後仍不能理解「一切都取決於指針」的目的。是否有人可以提供一些樣品?謝謝。

+0

你不明白什麼?爲什麼API是用typedef而不是'T *'來定義的? ...因爲它允許根據其他類型定義API,所以更靈活。 – 2015-03-02 12:08:46

回答

0

unique_ptr設計以這樣一種方式,如果你不提供在聲明中有刪除,由於缺省模板參數,它採用了default_deleter(std::default_delete<T>)這只是「delete」指針。它使用SFINAE在Deleter Type中查找「指針」的定義。如果你的unique_ptr持有另一個smart_ptr(它定義了「指針」),那麼在析構函數中,它會調用你所持有的unique_ptr的刪除器。

實施例:

class BufferClass 
{ 
public: 
    BufferClass() 
    { 
     // init 
    } 
    ~BufferClass() 
    { 
     delete [] buffer; 
    } 
    int *buffer; 
}; 

// a short declaration for unique_ptr<BufferClass> 
typedef unique_ptr<BufferClass> BufferPointer;  

BufferPointer myBuffer(new BufferClass(10)); // myBuffer holds BufferClass. 
// when myBuffer goes out of scope, u'll have BufferClass::~BufferClass called. 

//let's say you want to store a unique_ptr in another unique_ptr.  
unique_ptr<BufferPointer> myBufferPointerPointer(&myBuffer); 
// so when myBufferPointerPointer goes out of scope, BufferClass::~BufferClass will be called eventually 
4

LWG issue 673加入pointerunique_ptr規範。它包含了這個子彈點動機:

  • 已努力以更好地支持容器,在共享內存的上下文智能指針作出。這種 支持的關鍵障礙之一是不假定指針類型實際上是T*D::pointer:此 可以很容易地用於unique_ptr通過具有刪除器 定義指針類型來實現的。此外,這種類型的可 容易被默認爲T*應刪除器D不選擇 定義指針類型(此處示例實現[斷鏈])。這個 更改沒有運行時間開銷。它在自定義delter類型的作者 上沒有接口開銷。它只是允許(但不要求)定製刪除類型 作者定義的unique_ptr的 存儲類型智能指針,如果他們發現這樣的功能非常有用。 std::default_delete是刪除程序的一個示例,默認情況下, 指針指向T*,只需忽略此問題並且不包括 pointer typedef

參見boost::offset_ptr對於可以引用共享存儲器的示例智能指針。

+0

或者說,你有x86_64代碼,使用寬泛的算術運算和額外的寄存器,但是從進程範圍的32位堆執行分配(因爲4GB對於特定問題而言是足夠的)。然後,'std :: unique_ptr's可能最終每個只有4個字節,(在空基類優化消除了刪除器的開銷之後)。這提高了CPU緩存的效果。 – 2015-03-03 23:40:54

相關問題