删除器类型为unique_ptr与shared_ptr
Deleter type in unique_ptr vs. shared_ptr
当我发现该标准以两种完全不同的方式定义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将删除器对象的类型"保存"为模板参数。这也可以从稍后从指针检索删除器的方式中看到:
// 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
是非成员函数?
在这里你可以找到智能指针的原始建议:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1450.html
它非常准确地回答了您的问题:
由于删除程序不是类型的一部分,因此更改分配策略不会破坏源或二进制兼容性,并且不需要客户端重新编译。
这也很有用,因为std::shared_ptr
客户端具有更大的灵活性,例如shared_ptr
具有不同删除程序的实例可以存储在同一个容器中。
此外,由于shared_ptr
实现无论如何都需要一个共享内存块(用于存储引用计数),并且因为与原始指针相比,alreay 必须有一些开销,因此添加类型擦除的删除器在这里没什么大不了的。
另一方面,unique_ptr
旨在完全没有开销,并且每个实例都必须嵌入其删除器,因此使其成为该类型的一部分是很自然的事情。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理