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

  1. Balance private load/unload calls (e.g. from deserialization callbacks)
  2. If no user code does private loads, report it as an engine bug with a call stack
  3. 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 GC

View on GitHub (pinned to 96fad776d2)