为什么 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
中的弱指针稍后被锁定时,结果是一个空的共享指针,因为指向的节点不再存在。
我正在尝试创建一个 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
中的弱指针稍后被锁定时,结果是一个空的共享指针,因为指向的节点不再存在。