为什么 std::weak_ptr<T>::lock return 在这里清空共享指针?

Why does std::weak_ptr<T>::lock return empty shared pointer here?

我正在尝试创建一个 AABBTree 结构,其中每个节点都知道它的 parent 和 children.

在我的 AABBTreeNode class 中,parent 存储为 std::shared_ptr<AABBTreeNode>,children 存储为 std::vector<std::weak_ptr<AABBTreeNode>>。 这样做是为了避免 Whosebug post.

中指出的循环引用

要添加新的 child 我首先计算一个有效的边界框并调用以下函数:

void AABBTreeNode::AddChild(std::shared_ptr<open3d::geometry::AxisAlignedBoundingBox> partitionBound)
{
    auto child = std::make_shared<AABBTreeNode>(shared_from_this(), m_Mesh, partitionBound);
    m_Children.push_back(child);
}

调用此函数后,我想使用 child - 但是锁定函数总是 returns 一个空的 std::shared_ptr<T>。这是调用代码(创建 Children 并用三角形填充它们应该递归完成):

void AABBTreeNode::AddTriangles(std::vector<Eigen::Vector3d>& centers)
{
    auto center = m_Bbox->GetCenter();
    for (auto& boundPoint : m_Bbox->GetBoxPoints())
    {
        // here is code, which calculates the minBound and maxBound for 
        // up to 8 Children

        auto adjustedPartitionBound = std::make_shared<open3d::geometry::AxisAlignedBoundingBox>(minBound, maxBound);
        AddChild(adjustedPartitionBound);
        auto child = m_Children.back().lock(); 
        if (child)
        {
            //this part is never reached, since child is alway empty...
            child->AddTriangles(partitionCenters);
        }
    }
}

为什么在这种情况下 child 总是空的? 我试图只包含代码的重要部分,如果缺少某些信息,请告诉我。

{
    auto child = std::make_shared<AABBTreeNode>(shared_from_this(), m_Mesh, partitionBound);
    m_Children.push_back(child);
}

这里,自动变量child是新建节点的唯一拥有者。在作用域的末尾,child 被自动销毁,因为它是最后一个所有者,节点也被销毁。

m_Children中的弱指针稍后被锁定时,结果是一个空的共享指针,因为指向的节点不再存在。