unique_ptr
和 shared_ptr
都可以接受自定义的删除器来调用它们所拥有的对象。但是在 unique_ptr
的情况下,删除器作为类的模板参数传递,而 shared_ptr
的自定义删除器类型则需要在构造函数的模板参数中指定。
template <class T, class D = default_delete<T>>
class unique_ptr
{
unique_ptr(T*, D&); //simplified
...
};
并且
template<class T>
class shared_ptr
{
template<typename D>
shared_ptr(T*, D); //simplified
...
};
我不明白为什么会有这样的差异。是什么导致了这种情况?
shared_ptr
类型擦除了删除器,即shared_ptr
的用户不必知道删除器的类型。这会产生运行时开销(分配、解引用),因此unique_ptr
不执行此操作(没有额外开销)。例如,请参见https://dev59.com/-Ww15IYBdhLWcg3w6f80。 - dypshared_ptr
会这样做呢? - qdiishared_ptr
表示共享所有权,不需要所有所有者都知道如何销毁对象,这可能已经足够提供此类型的擦除。由于簿记对象的存在,开销也不会更大。 - dypshared_ptr
的实现方式几乎没有类型抹除的额外开销,因为它们只是将其与所需用于记录管理数据的开销结合在一起。--虽然任何所有者可能需要销毁shared_ptr
拥有的东西,但所有者不需要知道如何做到这一点,也就是说,它不需要查看所拥有的东西的释放函数的定义或声明。 - dyp