从void *转换为shared_ptr *

时间:2016-03-14 16:24:04

标签: c++11 shared-ptr undefined-behavior void-pointers static-cast

我有一个共享指针,由于与C库的交互,将其生命的一部分用作void*

class Base { };

class Derived : public Base { };

int main() {
  // Construct the object.
  std::shared_ptr<Derived> derived = std::make_shared<Derived>();

  // Make a void* that I can pass into the C library.
  std::shared_ptr<Derived>* derived_ptr = new std::shared_ptr<Derived>(derived);
  void* my_void = derived_ptr;

  // Cast back into a shared_ptr when I get the void* from the C library
  std::shared_ptr<Base> base = *static_cast<std::shared_ptr<Base>* >(my_void);
}

我担心的是,我可能会导致未定义的行为,因为当我从C库收到std::shared_ptr<Base>*时,我正在转向void*,而不是强制转换为std::shared_ptr<Derived>*。我认为如果我只存储一个C风格的指针,这将是安全的,但我不知道继承和转换如何使用共享指针。

不幸的是,对于我的程序当前结构的方式,当我从C库中读取void*时,我不知道派生类,所以我不能只是转换为{{ 1}},我知道这是安全的。

对于std::shared_ptr<Derived>*Base类的任何可能组合,是否可以安全地使用当前显示的强制转换,或者是否存在未定义结果的情况?

0 个答案:

没有答案