6

是否可以从 boost::weak_ptr 获取原始指针?Boost 的 shared_ptr 有 get() 方法和“->”操作符。weak_ptr 没有相同的功能背后是否有一些理由?

4

3 回答 3

16

Aweak_ptr持有一个非拥有引用,因此它所引用的对象可能不再存在。使用 a 持有的原始指针本质上是危险的weak_ptr

正确的方法是将 提升weak_ptrshared_ptrusingweak_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 回答