【发布时间】:2022-01-01 10:24:27
【问题描述】:
我对@987654322@ 调用weak_ptr 的行为感到有些困惑。我的理解是.lock() 将返回一个相关类型的shared_ptr,如果它没有过期否则它将是一个空指针。
来自https://en.cppreference.com/w/cpp/memory/weak_ptr/lock:
如果 std::weak_ptr::expired 返回 false,则共享拥有对象的所有权的 shared_ptr。
然而,这不是我看到的结果。下面的代码是Unit 类的一个方法,它应该将shared_ptr 返回给Unit 的父级:
unsigned Unit::getParentId() const {
auto parent = parent_.lock();
return parent->getId();
}
下面的调试器输出显示parent_ 作为weak_ptr 存在。但是,当我调用 auto parent = parent_.lock(); 时,它会返回一个 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
【问题讨论】: