Wor*_*der 24 c++ shared-ptr unique-ptr c++11
当我发现标准定义std::unique_ptr
并且std::shared_ptr
以两种完全不同的方式关于指针可能拥有的Deleter时,我认为这很奇怪.这是来自cppreference :: unique_ptr和cppreference :: shared_ptr的声明:
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
template< class T > class shared_ptr;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,unique_ptr将"Deleter"对象的类型"保存"为模板参数.这也可以通过稍后从指针中检索Deleter的方式看出:
// 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);
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种差异背后的理性吗?我明显赞成这个概念,unique_ptr
为什么这不适用于此shared_ptr
?另外,为什么get_deleter
在后一种情况下会成为非成员函数呢?
Hor*_*ing 21
在这里,您可以找到智能指针的原始提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1450.html
它非常准确地回答了你的问题:
由于删除器不是类型的一部分,因此更改分配策略不会破坏源或二进制兼容性,也不需要重新编译客户端.
这也很有用,因为它为客户端提供了std::shared_ptr
一些更大的灵活性,例如,shared_ptr
具有不同删除器的实例可以存储在同一个容器中.
此外,因为shared_ptr
无论如何实现都需要共享内存块(用于存储引用计数),并且因为与原始指针相比必须有一些开销,所以在这里添加类型擦除的删除器并不是什么大问题.
unique_ptr
另一方面,它们总是没有任何开销,每个实例都必须嵌入它的删除器,因此将它作为类型的一部分是很自然的事情.
归档时间: |
|
查看次数: |
3755 次 |
最近记录: |