我有一个共享指针,由于与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
类的任何可能组合,是否可以安全地使用当前显示的强制转换,或者是否存在未定义结果的情况?