在 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_ptrUnit 的父级:

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 锁定时为空。