From 32614152a6f28eef7f83fb9733e7ccd57b4459ca Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 3 Mar 2022 10:15:58 +0100 Subject: [PATCH] Memory Management : Fix memory leak in bounding box tree --- Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp b/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp index 89086e5467..7fbc9d3e8b 100644 --- a/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp +++ b/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp @@ -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(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 //--------------------------------------------------------------------------------------------------