【问题标题】:How to re-cycle the Control Block allocated for std::shared_ptr如何重新循环分配给 std::shared_ptr 的控制块
【发布时间】:2021-02-21 07:53:56
【问题描述】:

std::shared_ptr 在内部分配(::new)一个控制块(引用计数对象)在堆中。当共享 ptr 的引用计数变为零时,此控制块被释放(::delete)。 出于性能原因,我需要重新循环为此控制块分配的内存。

已接受对问题 Is an Object Pool pattern of shared_ptr possible? 的回答,表示自定义分配器应该可以解决问题。 但我不清楚为 Y 创建的分配器(Alloc)对象如何分配控制块

template< class Y, class Deleter, class Alloc > std::shared_ptr( Y* ptr, Deleter d, Alloc alloc );

有人可以请 指向为 std::shared_ptr 编写的自定义分配器的示例,它重新循环控制块对象

提供部分代码来循环控制块

解释Allocator&lt;Y&gt; 如何为std::shared_ptr template&lt; class Y, class Deleter, class Alloc &gt; 分配控制块

注意:我正在寻找不使用 boost::intrusive_ptr 的解决方案

【问题讨论】:

  • 如果你使用make_shared/allocate_shared,将只分配一个块。坚持这些,就没有什么可回收的了。 :-)
  • shared_ptr 构造函数采用分配器将使用allocator_traits::rebind_alloc 获取用于控制块的某些内部类型的分配器。

标签: c++ c++11


【解决方案1】:

您只需要检查是否没有剩余的弱指针(弱引用计数器 = 0)然后执行ptr.reset()

【讨论】:

  • 你是说 shared_ptr::reset() 不会删除控制块(即与最后一个 shared_ptr 一起保存,其中包含 ptr)?
  • 即使上述情况属实,如果最后一个 shared_ptr 被破坏,仍然会删除控制块对吗? (例如,最后一个 shared_ptr 是一个局部变量并超出范围)。
  • 没有。如果相关的weak_ptr 还活着,则保留 cb
  • 那么如果没有weak_ptr,一旦最后共享的ptr被reset(),cb会被删除吗?如果是这样,如何回收?
  • 对不起,如果它被销毁(没有被回收),你能解释一下你的“答案”如何回答我的问题
猜你喜欢
  • 2016-07-31
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2017-07-28
相关资源
最近更新 更多