stride3d/stride · error · InvalidOperationException
Cannot release an object that doesn't have active private…
Error message
Cannot release an object that doesn't have active private references. This is either due to non-matching Load/Unload pairs or an engine internal error.
What it means
Reference-counting underflow guard in ContentManager.DecrementReference (private path): a private reference release is attempted while PrivateReferenceCount is zero. Either private Load/Unload pairs are unbalanced or an engine-internal bookkeeping error dropped a private reference.
Solutions
- Balance private load/unload calls (e.g. from deserialization callbacks)
- If no user code does private loads, report it as an engine bug with a call stack
- Update to a version with content reference-counting fixes if known issues apply
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs:51 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/a6350e6da077ce37.
Report an issue: GitHub.
Appendix: source
Thrown at sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs:51
/// <summary>
/// Decrements reference count of an <see cref="Reference"/>.
/// </summary>
/// <param name="reference">The reference.</param>
/// <param name="publicReference">True if public erefere</param>
internal void DecrementReference(Reference reference, bool publicReference)
{
int referenceCount;
if (publicReference)
{
if (reference.PublicReferenceCount <= 0)
throw new InvalidOperationException("Cannot release an object that doesn't have active public references. Load/Unload pairs must match.");
referenceCount = --reference.PublicReferenceCount + reference.PrivateReferenceCount;
}
else
{
if (reference.PrivateReferenceCount <= 0)
throw new InvalidOperationException("Cannot release an object that doesn't have active private references. This is either due to non-matching Load/Unload pairs or an engine internal error.");
referenceCount = --reference.PrivateReferenceCount + reference.PublicReferenceCount;
}
if (referenceCount == 0)
{
// Free the object itself
ReleaseAsset(reference);
// Free all its referenced objects
foreach (var childReference in reference.References)
{
DecrementReference(childReference, false);
}
}
else if (publicReference && reference.PublicReferenceCount == 0)
{
// If there is no more public reference but object is still alive, let's kick a cycle GCView on GitHub (pinned to 96fad776d2)