Skip to content

Release cleared elements in RingBuffer.Clear - #74

Merged
matt-edmondson merged 1 commit into
mainfrom
claude/containers-72-ringbuffer-clear-references
Sep 26, 2026
Merged

matt-edmondson merged 1 commit into
mainfrom
claude/containers-72-ringbuffer-clear-references

Conversation

@matt-edmondson

Copy link
Copy Markdown
Contributor

Fixes #72

RingBuffer<T>.Clear() only reset BackIndex, FrontIndex and Count. The backing array kept every reference-type element that had been removed, so up to N objects stayed alive until a later PushBack overwrote their slots. If the buffer was never refilled, that never happened.

Clear() now clears the backing array before it resets the indices, but only when T holds references. On .NET 5+ that check is RuntimeHelpers.IsReferenceOrContainsReferences<T>(), and on netstandard it is !typeof(T).IsValueType. ContiguousCollection already does the same thing.

Tests

  • Added Clear_ReleasesReferencesToClearedElements. It fills a buffer with objects that nothing else references, calls Clear(), forces a GC, and asserts that every WeakReference is dead.
  • I reverted the fix and ran the test again: it fails (Expected condition to be false). With the fix it passes.
  • The full Containers.Test suite passes (390/390), and the Release build has no warnings.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YXTjHR3MfJpmxt8LEwNkjm


Generated by Claude Code

Clear only reset the indices, so every reference-type element that was
logically removed stayed reachable from the backing array until a later
PushBack overwrote its slot. Clear the array first when T holds
references, as the Contiguous containers already do.

Fixes #72

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YXTjHR3MfJpmxt8LEwNkjm
@sonarqubecloud

Copy link
Copy Markdown

@matt-edmondson
matt-edmondson merged commit 830a6b4 into main Sep 26, 2026
12 checks passed
@matt-edmondson
matt-edmondson deleted the claude/containers-72-ringbuffer-clear-references branch September 26, 2026 23:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RingBuffer<T>.Clear() keeps cleared reference-type elements alive (memory leak)

2 participants