【问题标题】:how to convert a boost::weak_ptr to a boost::shared_ptr如何将 boost::weak_ptr 转换为 boost::shared_ptr
【发布时间】:2011-04-22 08:13:17
【问题描述】:

我有一个 shared_ptr 和一个 weak_ptr

typedef boost::weak_ptr<classname> classnamePtr;
typedef boost::shared_ptr<x> xPtr;

如何将weak_ptr 转换为shared_ptr

shared_ptr = weak_ptr;
Xptr = classnameptr; ?????

【问题讨论】:

标签: c++ boost boost-smart-ptr


【解决方案1】:

如前所述

boost::shared_ptr<Type> ptr = weak_ptr.lock(); 

如果您不想要异常或只是使用强制转换构造函数

boost::shared_ptr<Type> ptr(weak_ptr);

如果弱指针已经被删除,这将抛出。

【讨论】:

    【解决方案2】:

    您不要将weak_ptr 转换为shared_ptr,因为这首先会破坏使用weak_ptr 的全部目的。

    要从weak_ptr 的实例中获取shared_ptr,请在weak_ptr 上调用lock
    通常你会做以下事情:

    weak_ptr<foo> wp = ...;
    
    if (shared_ptr<foo> sp = wp.lock())
    {
        // safe to use sp
    }
    

    【讨论】:

    • 嘿,idanthanx 回复
    • typedef boost::shared_ptr SmsMessagePtr;为了避免循环引用,我要把它改成弱 ptr 我该怎么做
    • typedef boost::weak_ptr classnamePtr; typedef boost::shared_ptr classnameWeakPtr;
    • 这就是我们声明weak_ptr的方式
    • 在你的shared_ptr typedef 中有weak 这个词,所以这可能会产生误导。但是为了给你一个更完整的答案,你必须展示更多的代码并且更具体。
    【解决方案3】:
    boost::shared_ptr<Type> ptr = weak_ptr.lock(); // weak_ptr being boost::weak_ptr<Type>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多