9

我有一个结构:

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;
}

这是有效和安全的吗?

4

2 回答 2

8

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

于 2012-07-24T06:56:00.480 回答
3

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

于 2012-07-24T04:55:05.587 回答