Memory Management : Fix memory leak in bounding box tree

This commit is contained in:
Magne Sjaastad 2022-03-03 10:15:58 +01:00
parent 0e57cfe201
commit 32614152a6

View File

@ -187,6 +187,9 @@ namespace cvf {
AABBTreeNodeInternal* createNode();
AABBTreeNodeLeaf* createOrAssignLeaf(size_t leafIndex, size_t bbId);
private:
static void deleteInternalNodesBottomUp(AABBTreeNode* node);
protected:
struct InternalNodeAndRange
{
@ -598,6 +601,7 @@ bool AABBTree::buildTree(AABBTreeNodeInternal* pNode, size_t iFromIdx, size_t iT
return true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -606,6 +610,8 @@ void AABBTree::freeThis()
// Delete all the internal nodes
if (m_pRoot)
{
AABBTree::deleteInternalNodesBottomUp(m_pRoot);
m_pRoot = NULL;
}
@ -781,6 +787,24 @@ cvf::AABBTreeNodeLeaf* AABBTree::createOrAssignLeaf(size_t leafIndex, size_t bbI
return leaf;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void AABBTree::deleteInternalNodesBottomUp(AABBTreeNode* node)
{
// All leaf nodes (AABBTreeNodeLeaf) are allocated in m_leafPool and does not require a delete
if (node->type() == AB_LEAF) return;
auto internalNode = dynamic_cast<AABBTreeNodeInternal*>(node);
CVF_ASSERT(internalNode);
AABBTree::deleteInternalNodesBottomUp(internalNode->left());
AABBTree::deleteInternalNodesBottomUp(internalNode->right());
delete internalNode;
}
//--------------------------------------------------------------------------------------------------
/// Creates leafs for the supplied valid bounding boxes, keeping the original index
//--------------------------------------------------------------------------------------------------