在 weak_ptr returns NULL shared_ptr 上调用 `.lock()`
Calling `.lock()` on weak_ptr returns NULL shared_ptr
我对 .lock()
调用 weak_ptr
的行为有些困惑。我的理解是 .lock()
将 return 一个相关类型的 shared_ptr
如果它还没有过期 否则 它将是一个空指针。
来自 https://en.cppreference.com/w/cpp/memory/weak_ptr/lock :
A shared_ptr which shares ownership of the owned object if std::weak_ptr::expired returns false.
但这不是我看到的结果。下面的代码是 Unit
class 的一个方法,它应该 return 一个 shared_ptr
到 Unit
的父级:
unsigned Unit::getParentId() const {
auto parent = parent_.lock();
return parent->getId();
}
下面的调试器输出显示 parent_
作为 weak_ptr
存在。然而,当我调用 auto parent = parent_.lock();
时,它 return 是一个 NULL
指针,如调试器输出的最后一行所示。
我显然遗漏了一些非常基本的东西?
this = {const Unit *} 0x16f1af010
id_ = {unsigned int} 234
name_ = {std::string} "Test"
parent_ = {std::weak_ptr<Unit>} std::__1::weak_ptr<Unit>::element_type @ 0x00006000034d00d8 strong=0 weak=2
__ptr_ = {std::weak_ptr<Unit>::element_type *} 0x6000034d00d8
id_ = {unsigned int} 0
name_ = {std::string} "Root"
parent_ = {std::weak_ptr<Unit>} nullptr
children_ = {std::vector<std::shared_ptr<Unit>>} size=0
children_ = {std::vector<std::shared_ptr<Unit>>} size=0
parent = {std::shared_ptr<Unit>} nullptr
__ptr_ = {std::shared_ptr<Unit>::element_type *} NULL
弱指针仅附加到现有的共享指针,弱指针本身不保存或创建任何对象指针。换句话说,如果你这样做:
std::weak_ptr<int> wp;
auto sp = wp.lock();
那么它总是 returns nullptr。您必须在构造函数中或通过赋值(=
)传递现有共享指针,例如
std::shared_ptr<int> sp = std::make_shared<int>();
std::weak_ptr<int> wp(sp);
auto spl = wp.lock(); // now spl is not null
或通过赋值
std::shared_ptr<int> sp = std::make_shared<int>();
std::weak_ptr<int> wp;
wp = sp;
auto spl = wp.lock(); // now spl is not null
只要共享指针的所有副本仍然存在,那么弱指针将 return 非空锁定。否则,如果不存在共享指针的副本,则弱指针将始终 return null.
在你的情况下,你没有共享指针的任何副本,因此在这种情况下,弱指针总是 return 锁定时为空。
我对 .lock()
调用 weak_ptr
的行为有些困惑。我的理解是 .lock()
将 return 一个相关类型的 shared_ptr
如果它还没有过期 否则 它将是一个空指针。
来自 https://en.cppreference.com/w/cpp/memory/weak_ptr/lock :
A shared_ptr which shares ownership of the owned object if std::weak_ptr::expired returns false.
但这不是我看到的结果。下面的代码是 Unit
class 的一个方法,它应该 return 一个 shared_ptr
到 Unit
的父级:
unsigned Unit::getParentId() const {
auto parent = parent_.lock();
return parent->getId();
}
下面的调试器输出显示 parent_
作为 weak_ptr
存在。然而,当我调用 auto parent = parent_.lock();
时,它 return 是一个 NULL
指针,如调试器输出的最后一行所示。
我显然遗漏了一些非常基本的东西?
this = {const Unit *} 0x16f1af010
id_ = {unsigned int} 234
name_ = {std::string} "Test"
parent_ = {std::weak_ptr<Unit>} std::__1::weak_ptr<Unit>::element_type @ 0x00006000034d00d8 strong=0 weak=2
__ptr_ = {std::weak_ptr<Unit>::element_type *} 0x6000034d00d8
id_ = {unsigned int} 0
name_ = {std::string} "Root"
parent_ = {std::weak_ptr<Unit>} nullptr
children_ = {std::vector<std::shared_ptr<Unit>>} size=0
children_ = {std::vector<std::shared_ptr<Unit>>} size=0
parent = {std::shared_ptr<Unit>} nullptr
__ptr_ = {std::shared_ptr<Unit>::element_type *} NULL
弱指针仅附加到现有的共享指针,弱指针本身不保存或创建任何对象指针。换句话说,如果你这样做:
std::weak_ptr<int> wp;
auto sp = wp.lock();
那么它总是 returns nullptr。您必须在构造函数中或通过赋值(=
)传递现有共享指针,例如
std::shared_ptr<int> sp = std::make_shared<int>();
std::weak_ptr<int> wp(sp);
auto spl = wp.lock(); // now spl is not null
或通过赋值
std::shared_ptr<int> sp = std::make_shared<int>();
std::weak_ptr<int> wp;
wp = sp;
auto spl = wp.lock(); // now spl is not null
只要共享指针的所有副本仍然存在,那么弱指针将 return 非空锁定。否则,如果不存在共享指针的副本,则弱指针将始终 return null.
在你的情况下,你没有共享指针的任何副本,因此在这种情况下,弱指针总是 return 锁定时为空。