当我发现标准在指针所拥有的Deleter方面对std::unique_ptr
和std::shared_ptr
定义了两种完全不同的方式时,我感到非常好奇。下面是来自cppreference::unique_ptr和cppreference::shared_ptr的声明:
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
template< class T > class shared_ptr;
正如您所看到的,unique_ptr将Deleter对象的类型作为模板参数“保存”。 这也可以在稍后从指针中检索Deleter的方式中看出:
// unique_ptr has a member function to retrieve the Deleter
template<
class T,
class Deleter = std::default_delete<T>
>
Deleter& unique_ptr<T, Deleter>::get_deleter();
// For shared_ptr this is not a member function
template<class Deleter, class T>
Deleter* get_deleter(const std::shared_ptr<T>& p);
能有人解释一下这种差异背后的理由吗?我显然倾向于使用unique_ptr
,为什么不把这个概念也应用到shared_ptr
中呢?此外,为什么在后一种情况下get_deleter
会成为一个非成员函数?
shared_ptr
更易于使用,但您需要支付类型抹除成本。将get_deleter
设置为成员将使编写接受shared_ptr<T>
的通用代码更加繁琐-您需要编写sp.template get_deleter<Deleter>()
而不是get_deleter<Deleter>(sp)
。这就是为什么std::get
是非成员的原因。 - T.C.unique_ptr
的设计目标之一是几乎没有开销。擦除删除器的类型很方便,但会引入运行时开销,因此对于unique_ptr
而言不如对于shared_ptr
合适。 - wakjahBase
没有虚析构函数,shared_ptr<Base> p = make_shared<Derived>()
也会做正确的事情。证明。 - Benoît