2

Howard Hinnant 解释说unique_ptr也可以使用自定义存储类型他以“共享内存”为例。

他只给出粗略的想法(这对于快速介绍来说很好)。但是任何人都可以完成他的“自定义存储类型”示例(无论是否共享内存)?

为了支持放入unique_ptr共享内存,自定义删除器可以包含自定义指针类型(在共享内存应用程序中通常不是真正的指针)。一个简单地放置一个称为指针的嵌套类型,它在您的删除器中模拟指针行为,可公开访问:

template <class T>
class MyDeleter
{
public:
    class pointer
    {
     public:
        friend bool operator==(pointer x, pointer y);
        friend bool operator!=(pointer x, pointer y);
        // ...
    };

    void operator()(pointer p);
};

void test()
{
    unique_ptr<int, MyDeleter<int> > p;
    MyDeleter<int>::pointer p2 = p.get();  // A custom pointer type used for storage
}

我怀疑// ...必须扩展它,并且test()可能会在真正的“自定义存储类型”示例中做一些额外的事情。

谁能告诉我他/她在哪里

  • 其实已经用过这个定制了,
  • 在这种情况下
  • 哪个自定义代码,(//...可能)
  • 以及客户端代码如何使用它?(test()大概)
4

2 回答 2

2

You might be interested in boost::offset_ptr which served as the motivating use case for this customization point in unique_ptr. offset_ptr is a fully developed pointer type which could be installed into a custom deleter using a simple typedef. Its use case is to put unique_ptr into shared memory.

于 2011-06-07T21:16:23.633 回答
2

20.7.1.2/3 告诉我们

unique_ptr<T, D>::pointer 类型应满足 NullablePointer (17.6.3.3) 的要求。

根据 17.6.3.3,给定一个 type P,这些要求是:

  • PEqualityComparableDefaultConstructibleCopyConstructibleCopyAssignableDestructible
  • 的左值P可交换的
  • 对类型 P 的对象进行值初始化会产生该类型的null 值,并且该 null 值应仅与其自身等价
  • 类型的对象P可以根据上下文转换bool
  • 类型的对象P可以用初始化和赋值nullptr,这会产生空值
  • 类型的对象P可以与 相等比较nullptr,并且当且仅当对象具有空值时比较为真
  • 所有必需的操作都不会抛出(但不需要显式noexceptor throw()

请特别注意,operator*实际上operator->并不是必需的。另请注意,内置数字类型满足除nullptr初始化/赋值之外的所有要求。

例如,以下类型应满足所有要求:

class handle {
    int id;
  public:
    // default and nullptr constructors folded together
    handle(std::nullptr_t = nullptr) : id(0) { }

    explicit operator bool() { return l.id != 0; }

    friend bool operator ==(handle l, handle r) { return l.id == r.id; }
    friend bool operator !=(handle l, handle r) { return !(l == r); }

    // default copy ctor and operator= are fine

    // explicit nullptr assignment and comparison unneeded
    // because of implicit nullptr constructor

    // swappable requirement fulfilled by std::swap
}
于 2011-06-07T22:04:23.073 回答