【问题标题】:Casting shared_ptr<T> to shared_ptr<void>将 shared_ptr<T> 转换为 shared_ptr<void>
【发布时间】:2012-07-22 08:57:56
【问题描述】:

我有一个结构:

struct Params {
   std::shared_ptr<void> user_data;
   /* ... */
};

我想这样使用它:

int main() {
  std::shared_ptr<SpecializedParams> sp(new SpecializedParams(100));
  Params params;
  /* ... */
  params.user_data = std::static_pointer_cast<void>(sp); 
  /* ... */
  std::shared_ptr<SpecializedParams> sp2 = 
    std::static_pointer_cast<SpecializedParams>(
      params.user_data
    );
  /* ... */
  return 0;
}

这是有效和安全的吗?

【问题讨论】:

  • 主块中的参数是什么?
  • 你不能delete一个空指针,所以你的代码甚至不应该编译。
  • @KerrekSB 指向 void 的共享指针当然是有效的。更多详情请看这里:stackoverflow.com/questions/5913396/…
  • @MichaelAnderson:哦,好吧,删除器是从参数中推导出来的,而不是从指针类型中推导出来的 - 有趣!
  • 您可能想使用static_pointer_cast 而不使用std::。由于依赖于参数的查找,它仍然可以工作。

标签: c++ casting c++11 shared-ptr


【解决方案1】:

实际删除共享对象的代码是在创建共享指针时确定的(这就是为什么在构造 shared_ptr 时需要完整类型而不是在破坏 shared_ptr 时需要完整类型的原因)。因此,即使您的 shared_ptr 是指向您的 SpecializedParams 对象的最后一个指针,该对象也会被正确销毁。

【讨论】:

    【解决方案2】:

    这应该是安全的,因为 void 铸造项目也是 shared_ptr 。它将添加对现有元素的引用,并且在 void 投射的项目消失之前不会被释放。

    【讨论】:

    • 它起作用的原因是因为与shared_ptr&lt;T&gt; 对象一起存储的隐藏删除器函数...否则仅在void 指针上调用delete 将无法正确释放内存资源由shared_ptr&lt;T&gt; 管理的对象。
    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2017-01-30
    • 2019-10-20
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多