【发布时间】:2014-12-10 05:28:21
【问题描述】:
我的类层次结构如下:
class BaseSession : public boost::enable_shared_from_this<BaseSession>
class DerivedSessionA : public BaseSession
class DerivedSessionB : public BaseSession
在派生类函数中,我经常这样调用函数:
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
由于我与shared_ptr 合作管理会话,因此工作正常。最近,我发现我对shared_ptr 的使用对于这种情况并不是最佳的。这是因为这些会话是为每个客户端维护一个套接字的单例对象。如果重新连接套接字,会话副本将成为僵尸。
作为解决方法,我开始通过引用而不是副本传递shared_ptr。这解决了僵尸问题。
理想情况下,我觉得我应该使用unique_ptr 来存储会话,然后将引用传递给其他函数。这打开了一整罐蠕虫。
如何将基类unique_ptr 对象转换为派生类unique_ptr 对象?以下行的unique_ptr 版本是什么?
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
我只想要一个会话对象的副本,其他的都应该是参考。
【问题讨论】:
-
如果动态转换失败,你的指向对象会发生什么?是应该删除它还是只希望在演员成功时移动而不是删除?
-
如果 dynamic_cast 失败,Func 得到一个空对象并取消操作。我不想搬家,主人应该保持原样。
-
我怀疑我正在寻找一个 weak_ptr 到 unique_ptr 对象。除了回到C指针,还有其他选择吗?
-
@SharathKShetty 简短回答:不。
unique_ptr表示所有权。弱指针需要包含锁定和引用计数的观察逻辑。这是有代价的,这就是为什么如果你愿意的话,你需要使用shared_ptr。好消息是你也可以使用std::dynamic_pointer_cast<>(和weak_ptr)。每个人都赢了。 -
我同意sehe。创建一个指向另一个智能指针已经拥有的资源的 unique_ptr 而不在两个容器之间移动资源是错误的。 weak_ptr 没有指向的资源的所有权,而是一个弱引用:所以从 weak_ptr 到 unique_ptr 的任何操作都是不可行的或非常不鼓励
标签: c++ boost smart-pointers unique-ptr dynamic-cast