将shared_ptr <T>转换为shared_ptr <void>

per*_*eal 9 c++ casting shared-ptr c++11

我有一个结构:

struct Params {
   std::shared_ptr<void> user_data;
   /* ... */
};
Run Code Online (Sandbox Code Playgroud)

我想这样使用它:

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;
}
Run Code Online (Sandbox Code Playgroud)

这有效且安全吗?

Tor*_*zki 7

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