std :: shared_ptr,具有加入的控制块和自定义删除器

时间:2019-01-25 16:37:08

标签: c++ c++11 templates memory-management

我正在尝试使用自定义删除器创建一个std::shared_ptr,在该删除器中,控制块的分配与该对象本身之一相连。

不能使用接受自定义删除器的std::shared_ptr的构造函数,因为这会导致对控制块本身的另一种分配:

std::shared_ptr<int> ptr(new int(0), [] (int*) {
  // ...
});

我进一步来到std::allocate_shared,以便为控制块和对象提供自定义分配器:

template <typename Object>
class my_allocator {
public:
  using value_type = Object;

  template <typename O>
  explicit my_allocator(my_allocator<O> const& other) {
  }

  Object* allocate(std::size_t n, const void* hint = nullptr) {
    assert(n == 1U);
    return static_cast<value_type*>(::operator new(sizeof(value_type)));
  }

  void deallocate(Object* p, std::size_t n) {
    assert(n == 1U);

    // My problem occurs here, the allocator is rebound to
    // an internal type provided by the standard library and
    // the actual pointer to the int can't be retrieved anymore.
    // The pointer can't be stored inside the allocator because it is
    // rebound to some internal type before allocation.
  }
};

// ...

using Object = int;
auto object = std::allocate_shared<Object>(my_allocator<Object>{},
                                           std::forward<Args>(args)...);

这里的问题是,只能控制连接的控制块的分配和释放,但无法提供我想用来延迟对象的实际删除的自定义删除器。

是否可以使用自定义删除器,但只有一个联合分配?

0 个答案:

没有答案