2015-03-02 62 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

相关问题