diff --git a/Sources/OpenSwiftUICore/Util/ThreadUtils.swift b/Sources/OpenSwiftUICore/Util/ThreadUtils.swift index 43286a35..414dc587 100644 --- a/Sources/OpenSwiftUICore/Util/ThreadUtils.swift +++ b/Sources/OpenSwiftUICore/Util/ThreadUtils.swift @@ -95,6 +95,12 @@ private final class AtomicBuffer: ManagedBuffer } return unsafeDowncast(buffer, to: AtomicBuffer.self) } + + deinit { + withUnsafeMutablePointerToElements { pointer in + _ = pointer.deinitialize(count: 1) + } + } } #else private final class AtomicBuffer: ManagedBuffer { @@ -107,6 +113,12 @@ private final class AtomicBuffer: ManagedBuffer { } return unsafeDowncast(buffer, to: AtomicBuffer.self) } + + deinit { + withUnsafeMutablePointerToElements { pointer in + _ = pointer.deinitialize(count: 1) + } + } } #endif diff --git a/Tests/OpenSwiftUICoreTests/Util/ThreadUtilsTests.swift b/Tests/OpenSwiftUICoreTests/Util/ThreadUtilsTests.swift index eee93323..addd782a 100644 --- a/Tests/OpenSwiftUICoreTests/Util/ThreadUtilsTests.swift +++ b/Tests/OpenSwiftUICoreTests/Util/ThreadUtilsTests.swift @@ -55,4 +55,27 @@ struct AtomicBoxTests { @AtomicBox var box: Int = 3 #expect($box.access { $0.description } == "3") } + + @Test + func deinitCheck() async throws { + final class DeinitCheck { + let confirmation: Confirmation + + init(confirmation: Confirmation) { + self.confirmation = confirmation + } + + deinit { + confirmation() + } + } + + func deinitCheck(_ confirmation: Confirmation) { + @AtomicBox var check = DeinitCheck(confirmation: confirmation) + } + + await confirmation { confirmation in + deinitCheck(confirmation) + } + } }