两者unique_ptr
和 shared_ptr
接受自定义删除器来调用他们拥有的对象。但是在 unique_ptr
的情况下,删除器是作为 class 的模板参数传递的,而 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
...
};
我不明白为什么会有这种差异。有什么要求?
最佳答案
如果您将删除器作为模板参数提供(如在 unique_ptr
中),它是该类型的一部分,您无需在该类型的对象中存储任何其他内容。
如果 deleter 作为构造函数的参数传递(如在 shared_ptr
中),则需要将其存储在对象中。这是额外灵 active 的代价,因为您可以对同一类型的对象使用不同的删除器。
我想这就是原因:unique_ptr
应该是非常轻量级的对象,开销为零。使用每个 unique_ptr
存储删除器可以使其大小加倍。因此,人们会改用旧的原始指针,这是错误的。
另一方面,shared_ptr
不是那么轻量级,因为它需要存储引用计数,所以存储自定义删除器看起来也不错。
关于c++ - 为什么在 shared_ptr 只取一个时 unique_ptr 取两个模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355037/