为什么unique_ptr在shared_ptr只占用一个时会占用两个模板参数?

qdi*_*dii 63 c++ std shared-ptr unique-ptr c++11

双方unique_ptrshared_ptr接受定制的析构函数他们所拥有的对象上调用.但在的情况下unique_ptr,析构函数作为一个模板参数传递,而类型shared_ptr的自定义析构函数将被指定为一个模板参数的构造函数.

template <class T, class D = default_delete<T>> 
class unique_ptr
{
    unique_ptr(T*, D&); //simplified
    ...
};
Run Code Online (Sandbox Code Playgroud)

template<class T>
class shared_ptr
{
    template<typename D>
    shared_ptr(T*, D); //simplified
    ...
};
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会有这样的差异.需要什么?

Woj*_*wka 57

如果将deleter作为模板参数提供(如unique_ptr),则它是类型的一部分,您不需要在此类型的对象中存储任何其他内容.如果将deleteter作为构造函数的参数传递(如shared_ptr),则需要将其存储在对象中.这是额外灵活性的代价,因为您可以为相同类型的对象使用不同的删除器.

我猜这就是原因:unique_ptr应该是非常轻量级的对象,零开销.每个存储删除器unique_ptr可以使其大小加倍.因为人们会使用旧的原始指针代替,这是错误的.

另一方面,shared_ptr它不是轻量级的,因为它需要存储引用计数,因此存储自定义删除器看起来也很好.

  • @qdii - 不,不是同一个对象,而是相同类型的不同shared_ptr. (3认同)
  • @qdii:您需要想象一个以`shared_ptr`作为参数的函数,或一个将`shared_ptr`存储为成员变量的对象。不必关心删除器,使它们更加灵活。 (2认同)
  • 这完全取决于权衡.unique_ptr不应该有任何开销,因此您描述的复杂性是必要的成本.在shared_ptr的情况下,已经存在一些开销,因此可以以更灵活的方式设计它. (2认同)