c++ - 为什么在 shared_ptr 只取一个时 unique_ptr 取两个模板参数?

标签 c++ c++11 std shared-ptr unique-ptr

两者unique_ptrshared_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/

相关文章:

c++ - std::list 的 erase 成员函数是否为所有存储的元素调用析构函数?

c++ - 使用 SecureZeroMemory() 真的有助于提高应用程序的安全性吗?

c++ - 添加多个字符串值

c++11 - 修复警告 "Wundefined-var-template"

c++ - 有没有办法解决供应商引入的#define?

c++ - C++11 是否支持 C11 的新特性?

c++ - 最好的跨平台(可移植)任意精度数学库

c++ - C 喜欢数组语法?

c++ - 如何从类型(类)转换为标准 :string?

c++ - 在 C++ 代码中奇怪地使用 void