是否可以从boost :: weak_ptr获取原始指针? Boost的shared_ptr有get()方法和“ - >”运营商。 weak_ptr背后是否有一些理由不具备相同的功能?
答案 0 :(得分:16)
weak_ptr
拥有非拥有引用,因此它引用的对象可能不再存在。使用由weak_ptr
保存的原始指针本身就很危险。
正确的方法是使用weak_ptr
将shared_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();