From a67fe054d54d1fdd4a73dbcee9c56a27db239f92 Mon Sep 17 00:00:00 2001 From: Clemens Eisenhofer <56730610+CEisenhofer@users.noreply.github.com> Date: Thu, 22 Sep 2022 20:26:08 +0200 Subject: [PATCH] Memory leak in .NET user-propagator (#6360) The user-propagator object has to be manually disposed (IDisposable), otherwise it stays in memory forever, as it cannot be garbage collected automatically --- src/api/dotnet/UserPropagator.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/api/dotnet/UserPropagator.cs b/src/api/dotnet/UserPropagator.cs index 9b4fbc9b7..b9cd4dc39 100644 --- a/src/api/dotnet/UserPropagator.cs +++ b/src/api/dotnet/UserPropagator.cs @@ -37,7 +37,7 @@ namespace Microsoft.Z3 /// /// Propagator context for .Net /// - public class UserPropagator + public class UserPropagator : IDisposable { /// /// Delegate type for fixed callback @@ -205,10 +205,20 @@ namespace Microsoft.Z3 } /// - /// Release provate memory. + /// Release private memory. /// ~UserPropagator() { + Dispose(); + } + + /// + /// Must be called. The object will not be garbage collected automatically even if the context is disposed + /// + public virtual void Dispose() + { + if (!gch.IsAllocated) + return; gch.Free(); if (solver == null) ctx.Dispose();