如何将boost::weak_ptr转换为boost::shared_ptr

5
我有一个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; ?????

你有没有去看这个文档?它在第一页。 - Sam Miller
3个回答

10

如已经所说

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

如果您不想要异常或仅使用强制类型转换构造函数

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

如果弱引用已经被删除,这将会抛出异常。


9

不要将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
}

嗨,Idan,谢谢你的回复。 - Pinky
为了避免循环引用,我将把它更改为弱指针。如何实现呢?typedef boost::weak_ptr<TSmsMessage> SmsMessagePtr; - Pinky
typedef boost::weak_ptr<classname> classnamePtr; typedef boost::shared_ptr<classname> classnameWeakPtr; - Pinky
这是我们声明 weak_ptr 的方式吗? - Pinky
1
在你的shared_ptr类型定义中有一个weak单词,这可能会让人产生误解。但是为了给你一个更完整的答案,你需要展示更多的代码并且更加具体明确。 - Idan K
显示剩余2条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接