为什么unique_ptr将删除器作为类型参数而shared_ptr没有?

时间:2011-07-26 11:51:15

标签: c++ smart-pointers type-erasure

std::unique_ptr模板有两个参数:指针对象的类型和删除器的类型。第二个参数有一个默认值,因此您通常只需编写类似std::unique_ptr<int>的内容。

std::shared_ptr模板只有一个参数:指针对象的类型。但是你也可以使用自定义删除器,即使删除类型不在类模板中。通常的实现使用类型擦除技术来做到这一点。

是否有理由不对std::unique_ptr使用相同的想法?

2 个答案:

答案 0 :(得分:37)

部分原因是shared_ptr无论如何都需要一个明确的控制块来进行引用计数,并且保留一个删除器并不是最重要的。 unique_ptr然而不需要任何额外的开销,并且添加它将是不受欢迎的 - 它应该是零开销类。 unique_ptr应该是静态的。

如果您想要这样的行为,您可以随时添加自己的类型擦除 - 例如,您可以拥有unique_ptr<T, std::function<void(T*)>>,这是我过去所做的事情。

答案 1 :(得分:2)

另一个原因,除了DeadMG指出的那个,就是可以写

std::unique_ptr<int[]> a(new int[100]);
由于专注于~unique_ptr和{{1},

delete会调用default_delete<_Tp[]>正确的版本(通过T) }。