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

  1. Audit Load/Unload call sites so every public load has exactly one matching unload
  2. Avoid unloading assets you did not load or that were loaded with a private reference
  3. 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)