我正在尝试使用智能指针创建带有接口库的对象池。但是,如果不将派生对象从weak_ptr转换为原始指针,则无法访问派生对象,这会扼杀智能指针的用途。此外,它还警告我,它容易受到悬空指针状态的影响。
是的,代码编译,但我不喜欢警告,目前它不应该是100%安全的,不管怎么说。
std::weak_ptr<IPooledObject> weakPtr = poolManager.SpawnFromPool();
if (EnemyEntity* enemy0 = reinterpret_cast<EnemyEntity*>(weakPtr.lock().get()))C26815:指针正在悬空,因为它指向一个被销毁的临时实例。
现在,我真正想要的是将weak_ptr与从poolManager.SpawnFromPool()返回的IPooledObject转换为另一个weak_ptr,而不是派生类EnemyEntity。
std::weak_ptr<EnemyEntity> enemy0 = poolManager.SpawnFromPool();最后一个代码片段是我理想中想要使用的方式,但它不编译。我自己不知道如何在两个弱指针类型(从IBase到派生)之间转换正确的语法。有人能帮忙吗?
发布于 2021-12-12 17:37:55
为了避免悬空指针问题,您需要确保shared_ptr在您需要访问对象的整个时间内都是活动的。然后,使用dynamic_pointer_cast在切入点上执行dynamic_cast:
if (auto sharedPtr = weakPtr.lock()) {
std::weak_ptr enemy0 = std::dynamic_pointer_cast<EnemyEntity>(sharedPtr);
} else {
// weakPtr has expired
}发布于 2021-12-12 17:48:12
您可以使用静态指针强制转换在一行中完成此操作。
std::weak_ptr<Derived> enemy0 = std::static_pointer_cast<Derived>(poolManager.SpawnFromPool().lock());https://stackoverflow.com/questions/70325993
复制相似问题