stride3d/stride · error · InvalidOperationException
Cannot release an object that doesn't have active public…
Error message
Cannot release an object that doesn't have active public references. Load/Unload pairs must match.
What it means
Reference-counting underflow guard in ContentManager.DecrementReference (public path): Unload/Release was called on an object whose PublicReferenceCount is already zero. Load (public) and Unload calls are not paired correctly, so the release exceeds the number of live public references.
Solutions
- Audit Load/Unload call sites so every public load has exactly one matching unload
- Avoid unloading assets you did not load or that were loaded with a private reference
- Enable content-manager reference logging to find the unmatched Unload
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs:44 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/4140fb2351f7792a.
Report an issue: GitHub.
Appendix: source
Thrown at sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs:44
}
else
{
reference.PrivateReferenceCount++;
}
}
/// <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)View on GitHub (pinned to 96fad776d2)