From 25b7003d2d15326dcc760cb3a1e8a6fa2c2092dd Mon Sep 17 00:00:00 2001 From: sebjf Date: Fri, 21 Mar 2025 17:52:40 +0000 Subject: [PATCH] Issue 6385 - Delete IfcGeom::Elements as soon as possible (#6411) * ISSUE #6385 Delete iterator elements as soon as they are moved past * ISSUE #6385 added loop to destructor to clean up initialised elements not yet disposed of by the iterator --- src/ifcgeom/Iterator.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/ifcgeom/Iterator.h b/src/ifcgeom/Iterator.h index e6e9dd42b0..199566bc14 100644 --- a/src/ifcgeom/Iterator.h +++ b/src/ifcgeom/Iterator.h @@ -663,6 +663,10 @@ namespace IfcGeom { /// Use get() to retrieve the created geometry. const IfcUtil::IfcBaseClass* next() { using std::chrono::high_resolution_clock; + + delete *task_result_iterator_; + delete *native_task_result_iterator_; + if (num_threads_ != 1) { if (!wait_for_element()) { Logger::SetProduct(boost::none); @@ -885,19 +889,16 @@ namespace IfcGeom { init_future_.wait(); } } - - if (settings_.get().get() != ifcopenshell::geometry::settings::NATIVE) { - for (auto& p : all_processed_native_elements_) { - delete p; - } - } for (auto& k : kernel_pool) { delete k; } - - for (auto& p : all_processed_elements_) { - delete p; + + if (task_result_ptr_initialized) { + while (task_result_iterator_ != --all_processed_elements_.end()) { + delete *task_result_iterator_++; + delete *native_task_result_iterator_++; + } } delete converter_;