diff --git a/scripts/run_experiments.jl b/scripts/run_experiments.jl
index 6c4e7c7c901fde0ea0888ec8edafea29c5b7d689..148cf5549408a901b9b0abb24f7b0c626451d9fe 100644
--- a/scripts/run_experiments.jl
+++ b/scripts/run_experiments.jl
@@ -193,6 +193,7 @@ function run_while(fwhile, alg)
         k += 1
         step!(st)
     end
+    close(st)
     return st
 end
 
diff --git a/src/common.jl b/src/common.jl
index e5fe03059e2b5ce8d0b8325090f1f0f86e3c3a4c..0748b6e543f1b44eb2805feacf60c9afad2e3062 100644
--- a/src/common.jl
+++ b/src/common.jl
@@ -48,6 +48,7 @@ information to act as a checkpoint for continuing the algorithm at that point.
 abstract type State end
 
 function init end
+function Base.close(::State) end
 function step! end
 function fetch end
 
diff --git a/src/dualtvdd.jl b/src/dualtvdd.jl
index da47e60c35358b3d4f3e082ce381582da5f99cef..2828d282ae3bdcd951c8706e73e4015d513ba0b5 100644
--- a/src/dualtvdd.jl
+++ b/src/dualtvdd.jl
@@ -88,6 +88,10 @@ function init(alg::DualTVDDAlgorithm{<:DualTVL1ROFOpProblem})
     return DualTVDDState(alg, p, subax, cons)
 end
 
+function Base.close(st::DualTVDDState)
+    foreach(close, st.cons)
+end
+
 function intersectin(a, b)
     c = intersect(a, b)
     az = first(a) - one(eltype(a))