diff --git a/src/ifcgeom/AbstractKernel.cpp b/src/ifcgeom/AbstractKernel.cpp index c5ecbc0684..9954b86531 100644 --- a/src/ifcgeom/AbstractKernel.cpp +++ b/src/ifcgeom/AbstractKernel.cpp @@ -206,6 +206,8 @@ ifcopenshell::geometry::kernels::AbstractKernel* ifcopenshell::geometry::kernels } #endif if (kernels.size() != n + 1) { + for (auto k : kernels) + delete k; throw IfcParse::IfcException("Invalid hybrid kernel " + geometry_library); } } diff --git a/src/ifcgeom/Converter.cpp b/src/ifcgeom/Converter.cpp index 9324e84329..15c06aef47 100644 --- a/src/ifcgeom/Converter.cpp +++ b/src/ifcgeom/Converter.cpp @@ -13,6 +13,16 @@ ifcopenshell::geometry::Converter::Converter(const std::string& geometry_library settings_ = mapping_->settings(); } +ifcopenshell::geometry::Converter::~Converter() +{ + if (kernel_ != nullptr) { + delete kernel_; + } + if (mapping_ != nullptr) { + delete mapping_; + } +} + namespace { void substitute_with_box_based_on_density(IfcGeom::ConversionResults& items, double& density) { int nv = 0; diff --git a/src/ifcgeom/Converter.h b/src/ifcgeom/Converter.h index 900faf827a..f0dcc72515 100644 --- a/src/ifcgeom/Converter.h +++ b/src/ifcgeom/Converter.h @@ -28,7 +28,7 @@ namespace ifcopenshell { namespace geometry { Converter(const std::string& geometry_library, IfcParse::IfcFile* file, ifcopenshell::geometry::Settings& settings); - ~Converter() {} + ~Converter(); ifcopenshell::geometry::abstract_mapping* mapping() const { return mapping_; } diff --git a/src/ifcgeom/kernels/opencascade/boolean_utils.cpp b/src/ifcgeom/kernels/opencascade/boolean_utils.cpp index 14efa8f65e..05d983f22d 100644 --- a/src/ifcgeom/kernels/opencascade/boolean_utils.cpp +++ b/src/ifcgeom/kernels/opencascade/boolean_utils.cpp @@ -978,6 +978,7 @@ bool IfcGeom::util::boolean_operation(const boolean_settings& settings, const To if (b.Extent() == 0) { Logger::Warning("No other operands remaining, using first operand"); result = a; + delete builder; return true; } @@ -1130,6 +1131,7 @@ bool IfcGeom::util::boolean_operation(const boolean_settings& settings, const To } else { Logger::Notice("Processed fully in 2D"); result = mp.Shape(); + delete builder; return true; } } else {