diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs
index a00ee8c305..d4f58fb6fb 100644
--- a/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs
+++ b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs
@@ -25,6 +25,10 @@ namespace SixLabors.ImageSharp.Memory
///
/// A weak reference to the source pool.
///
+ ///
+ /// By using a weak reference here, we are making sure that array pools and their retained arrays are always GC-ed
+ /// after a call to , regardless of having buffer instances still being in use.
+ ///
private WeakReference> sourcePoolReference;
public Buffer(byte[] data, int length, ArrayPool sourcePool)
diff --git a/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs
index 805bc908cd..a199bb319d 100644
--- a/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs
+++ b/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs
@@ -127,14 +127,21 @@ namespace SixLabors.ImageSharp.Tests.Memory
}
}
- [Fact]
- public void ReleaseRetainedResources_ReplacesInnerArrayPool()
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void ReleaseRetainedResources_ReplacesInnerArrayPool(bool keepBufferAlive)
{
IBuffer buffer = this.MemoryManager.Allocate(32);
ref int ptrToPrev0 = ref buffer.Span.DangerousGetPinnableReference();
- buffer.Dispose();
+
+ if (!keepBufferAlive)
+ {
+ buffer.Dispose();
+ }
this.MemoryManager.ReleaseRetainedResources();
+
buffer = this.MemoryManager.Allocate(32);
Assert.False(Unsafe.AreSame(ref ptrToPrev0, ref buffer.DangerousGetPinnableReference()));
diff --git a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs
index e96aa2e375..db7367d972 100644
--- a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs
+++ b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs
@@ -104,7 +104,7 @@ namespace SixLabors.ImageSharp.Tests.Memory
{
BufferArea area0 = buffer.GetArea(6, 8, 10, 10);
- ref int r = ref area0.GetReferenceToOrigo();
+ ref int r = ref area0.GetReferenceToOrigin();
int expected = buffer[6, 8];
Assert.Equal(expected, r);