diff --git a/src/mo_optimization_types.f90 b/src/mo_optimization_types.f90
index 062a5a11bc9e25a0d9a707ca9d684561038d224f..8ecbdb1e43810c659fdd49566223c28f4b9abc38 100644
--- a/src/mo_optimization_types.f90
+++ b/src/mo_optimization_types.f90
@@ -56,6 +56,7 @@ MODULE mo_optimization_types
     procedure, private :: sim_data_set_pointer_4d
     procedure, private :: sim_data_set_pointer_5d
     ! ToDo: destructor
+    final :: sim_data_destructor
     generic, public   :: set_pointer => sim_data_set_pointer_1d, sim_data_set_pointer_2d, &
       sim_data_set_pointer_3d, sim_data_set_pointer_4d, sim_data_set_pointer_5d
   end type sim_data_t
@@ -72,6 +73,7 @@ MODULE mo_optimization_types
                                                                                 !< 0 total, n every n timestep
   contains
     procedure, public :: is_allocated => sim_var_is_allocated
+    final :: sim_var_destructor
   end type sim_var_t
 
   !> \brief optional data, such as sm, neutrons, et, tws
@@ -396,4 +398,23 @@ MODULE mo_optimization_types
     this%averageCounter = this%averageCounter + 1
   end subroutine optidata_sim_average_add
 
+  subroutine sim_data_destructor(this)
+    type(sim_data_t),    intent(inout) :: this
+
+    if (allocated(this%variables)) deallocate(this%variables)
+
+  end subroutine sim_data_destructor
+
+  subroutine sim_var_destructor(this)
+    type(sim_var_t),    intent(inout) :: this
+
+    if (allocated(this%name)) deallocate(this%name)
+    if (allocated(this%data_1d)) deallocate(this%data_1d)
+    if (allocated(this%data_2d)) deallocate(this%data_2d)
+    if (allocated(this%data_3d)) deallocate(this%data_3d)
+    if (allocated(this%data_4d)) deallocate(this%data_4d)
+    if (allocated(this%data_5d)) deallocate(this%data_5d)
+
+  end subroutine sim_var_destructor
+
 END MODULE mo_optimization_types