[英]Casting weak_ptr<IBase> to weak_ptr<Derived>
我正在尝试使用智能指针创建带有接口库的 object 池。 但是,我无法访问派生的 object 而不将其从weak_ptr 转换为原始指针,这会破坏智能指针的用途。 它还警告我它容易受到悬空指针 state 的攻击。
是的,代码可以编译,但我不喜欢警告,目前无论如何它都不应该是 100% 安全的。
std::weak_ptr<IPooledObject> weakPtr = poolManager.SpawnFromPool();
if (EnemyEntity* enemy0 = reinterpret_cast<EnemyEntity*>(weakPtr.lock().get()))
C26815:指针悬空,因为它指向已销毁的临时实例。
现在我真正想要的是将带有从 poolManager.SpawnFromPool() 返回的 IPooledObject 的 weak_ptr 转换为另一个带有派生的 class EnemyEntity 的weak_ptr。
std::weak_ptr<EnemyEntity> enemy0 = poolManager.SpawnFromPool();
最后一个代码片段是我理想的使用方式,但它无法编译。 我自己无法弄清楚如何在两种弱指针类型(从 IBase 到 Derived)之间进行转换的正确语法。 有人可以帮忙吗?
为避免悬空指针问题,您需要确保shared_ptr
在您需要访问 object 的整个时间内都处于活动状态。 然后,使用dynamic_pointer_cast
在指针上执行dynamic_cast
:
if (auto sharedPtr = weakPtr.lock()) {
std::weak_ptr enemy0 = std::dynamic_pointer_cast<EnemyEntity>(sharedPtr);
} else {
// weakPtr has expired
}
您可以在 static 指针转换的帮助下在一行中完成
std::weak_ptr<Derived> enemy0 = std::static_pointer_cast<Derived>(poolManager.SpawnFromPool().lock());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.