我可以从boost的weak_ptr获得一个原始指针吗?

时间:2010-05-17 14:32:51

标签: c++ boost shared-ptr smart-pointers weak-references

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

3 个答案:

答案 0 :(得分:16)

weak_ptr拥有非拥有引用,因此它引用的对象可能不再存在。使用由weak_ptr保存的原始指针本身就很危险。

正确的方法是使用weak_ptrshared_ptr提升为weak_ptr::lock()并从中获取指针。

Boost weak_ptr documentation解释了为什么在get()中提供weak_ptr功能是不安全的,并且提供了可能导致问题的代码示例。

答案 1 :(得分: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块,这有助于防止意外使用非初始化的引用,或者保持强引用的时间长于实际需要的时间。 / p>

答案 2 :(得分:2)

首先需要在获取原始指针之前从weak_ptr派生shared_ptr。

您可以调用lock来获取shared_ptr或shared_ptr构造函数:

boost::weak_ptr<int> example;
...

int* raw = boost::shared_ptr<int>(example).get();