是否可以从 boost::weak_ptr 获取原始指针?Boost 的 shared_ptr 有 get() 方法和“->”操作符。weak_ptr 没有相同的功能背后是否有一些理由?
问问题
6219 次
3 回答
16
Aweak_ptr
持有一个非拥有引用,因此它所引用的对象可能不再存在。使用 a 持有的原始指针本质上是危险的weak_ptr
。
正确的方法是将 提升weak_ptr
为shared_ptr
usingweak_ptr::lock()
并从中获取指针。
Boostweak_ptr
文档解释了为什么将功能get()
作为weak_ptr
.
于 2010-05-17T14:34:47.860 回答
3
这是一个老问题,接受的答案很好,所以我不愿发布另一个答案,但似乎缺少的一件事是一个很好的惯用用法示例:
boost::weak_ptr<T> weak_example;
...
if (boost::shared_ptr<T> example = weak_example.lock())
{
// do something with example; it's safe to use example.get() to get the
// raw pointer, *only if* it's only used within this scope, not cached.
}
else
{
// do something sensible (often nothing) if the object's already destroyed
}
这个习惯用法的一个关键优势是强指针的作用域是 if-true 块,这有助于防止意外使用未初始化的引用,或者保持强引用比实际需要的时间长。
于 2012-02-14T05:34:35.350 回答
2
在获取原始指针之前,您首先需要从weak_ptr 派生shared_ptr。
您可以调用lock来获取 shared_ptr 或 shared_ptr 构造函数:
boost::weak_ptr<int> example;
...
int* raw = boost::shared_ptr<int>(example).get();
于 2010-05-17T14:39:45.203 回答