diff --git a/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs b/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs index 5dc04d736..db47d9734 100644 --- a/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs +++ b/Dalamud/Interface/Internal/ImGuiClipboardConfig.cs @@ -32,6 +32,7 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable private readonly nint clipboardUserDataOriginal; private readonly delegate* unmanaged setTextOriginal; private readonly delegate* unmanaged getTextOriginal; + private GCHandle clipboardUserData; [ServiceManager.ServiceConstructor] private ImGuiClipboardConfig(InterfaceManager.InterfaceManagerWithScene imws) @@ -46,7 +47,7 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable this.clipboardUserDataOriginal = io.ClipboardUserData; io.SetClipboardTextFn = (nint)(delegate* unmanaged)(&StaticSetClipboardTextImpl); io.GetClipboardTextFn = (nint)(delegate* unmanaged)&StaticGetClipboardTextImpl; - io.ClipboardUserData = GCHandle.ToIntPtr(GCHandle.Alloc(this)); + io.ClipboardUserData = GCHandle.ToIntPtr(this.clipboardUserData = GCHandle.Alloc(this)); return; [UnmanagedCallersOnly] @@ -76,14 +77,15 @@ internal sealed unsafe class ImGuiClipboardConfig : IServiceType, IDisposable private void ReleaseUnmanagedResources() { - var io = ImGui.GetIO(); - if (io.ClipboardUserData == default) + if (!this.clipboardUserData.IsAllocated) return; - GCHandle.FromIntPtr(io.ClipboardUserData).Free(); + var io = ImGui.GetIO(); io.SetClipboardTextFn = (nint)this.setTextOriginal; io.GetClipboardTextFn = (nint)this.getTextOriginal; io.ClipboardUserData = this.clipboardUserDataOriginal; + + this.clipboardUserData.Free(); } private void SetClipboardTextImpl(byte* text)