关于unique_ptr内原始指针的类型

about the type of raw pointer inside unique_ptr

本文关键字:指针 类型 原始 unique ptr 关于      更新时间:2023-10-16

我读了这本书[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
相关文章: