关于unique_ptr内原始指针的类型
about the type of raw pointer inside unique_ptr
我读了这本书[C++标准图书馆第二版],发现了下面的部分:
namespace std {
template <typename T, typename D>
class unique_ptr<T[], D>
{
public:
typedef ... pointer; // may be D::pointer
typedef T element_type;
typedef D deleter_type;
...
};
}
元素类型 T 可能无效,以便唯一指针拥有具有未指定的对象类型,就像 void* 一样。另请注意,定义了类型指针,该指针不一定定义作为 T*。如果删除程序 D 具有指针类型def,则将改用此类型。在这种情况下,模板参数 T 只有类型标记的效果,因为没有成员作为依赖于 T 的类unique_ptr<>;一切都取决于指针。优点是因此,unique_ptr可以保存其他智能指针。
读完本节后,我仍然无法理解"一切都取决于指针"的目的。有没有人可以提供一些样品?谢谢。
LWG 问题 673 在 unique_ptr
规范中添加了pointer
。 它包含以下动机要点:
- 已经努力在共享内存上下文中更好地支持容器和智能指针。其中的关键障碍之一 支持不是假设指针类型实际上是
T*
。这 可以通过删除器轻松完成unique_ptr
定义指针类型:D::pointer
。此外,这种类型可以 很容易默认为T*
如果删除程序D
选择不 定义指针类型(此处的示例实现[断开的链接](。这 更改没有运行时开销。它没有接口开销 自定义 Delter 类型的作者。它只是允许(但不是必需的( 自定义删除程序类型的作者,用于定义智能指针 存储类型的unique_ptr
,如果他们发现此类功能有用。std::default_delete
是默认删除程序的示例 指向T*
的指针,只需忽略此问题,不包括pointer typedef
.
有关可以引用共享内存的示例智能指针,请参阅 boost::offset_ptr
。
unique_ptr
的设计方式是,如果你没有在声明中提供删除器,由于默认的模板参数,它使用一个default_deleter(std::default_delete<T>
(只是"delete
"你的指针。它使用 SFINAE 在删除器类型中查找"指针"的定义。如果您的unique_ptr
持有另一个smart_ptr(定义了"指针"(,则在析构函数中,它会调用您持有的unique_ptr
的删除器。
例:
class BufferClass
{
public:
BufferClass()
{
// init
}
~BufferClass()
{
delete [] buffer;
}
int *buffer;
};
// a short declaration for unique_ptr<BufferClass>
typedef unique_ptr<BufferClass> BufferPointer;
BufferPointer myBuffer(new BufferClass(10)); // myBuffer holds BufferClass.
// when myBuffer goes out of scope, u'll have BufferClass::~BufferClass called.
//let's say you want to store a unique_ptr in another unique_ptr.
unique_ptr<BufferPointer> myBufferPointerPointer(&myBuffer);
// so when myBufferPointerPointer goes out of scope, BufferClass::~BufferClass will be called eventually
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?