使用 rebind_alloc 是一个错误吗?

Posted

技术标签:

【中文标题】使用 rebind_alloc 是一个错误吗?【英文标题】:Is this use of rebind_alloc an error? 【发布时间】:2018-03-04 09:39:20 【问题描述】:

在 boost.asio 的官方示例中,我找到了以下代码:

template <class Func, class Alloc>
void post(Func f, const Alloc& a) const

  auto p(std::allocate_shared<item<Func>>(
    typename std::allocator_traits<
    Alloc>::template rebind_alloc<char>(a),
    priority_, std::move(f)));
  std::lock_guard<std::mutex> lock(context_.mutex_);
  context_.queue_.push(p);
  context_.condition_.notify_one();

是否应该将rebind_alloc&lt;char&gt; 修改为rebind_alloc&lt;item&lt;Func&gt;&gt;

【问题讨论】:

【参考方案1】:

没关系。 allocate_shared 的规范说:

allocate_shared 模板使用a 的副本(对未指定的value_type 进行反弹)来分配内存。

无论如何,该函数从不直接分配指针;它通常分配一个带有嵌入式指针对象的 shared_ptr 控制块。因此,您通过的任何分配都必须被反弹。

重新绑定到char 的优点是它更短,并且不必针对所使用的类型进行调整。 (int 可能更短,但 char 有时被理解为“原始内存”。)重新绑定到指针类型的优点是它不会让其他程序员感到困惑。

【讨论】:

以上是关于使用 rebind_alloc 是一个错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

在频道中使用引用是错误/坏事吗?

在库中使用 CMake "set(XXXX CACHE ...)" 是一个错误吗?

贝宝改变了取消网址的含义吗?或者它是一个错误?

这是 android 中 CheckBox 的错误吗?

我可以/我应该使用 std::exception 进行常规错误处理吗?

这些错误与错误的语法或更新的包问题有关吗?