{"record":{"id":"a6350e6da077ce37","repo":"stride3d/stride","slug":"cannot-release-an-object-that-doesn-t-have-active-private","errorCode":null,"errorMessage":"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.","messagePattern":"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\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs","lineNumber":51,"sourceCode":"    /// <summary>\n    /// Decrements reference count of an <see cref=\"Reference\"/>.\n    /// </summary>\n    /// <param name=\"reference\">The reference.</param>\n    /// <param name=\"publicReference\">True if public erefere</param>\n    internal void DecrementReference(Reference reference, bool publicReference)\n    {\n        int referenceCount;\n        if (publicReference)\n        {\n            if (reference.PublicReferenceCount <= 0)\n                throw new InvalidOperationException(\"Cannot release an object that doesn't have active public references. Load/Unload pairs must match.\");\n\n            referenceCount = --reference.PublicReferenceCount + reference.PrivateReferenceCount;\n        }\n        else\n        {\n            if (reference.PrivateReferenceCount <= 0)\n                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.\");\n             \n            referenceCount = --reference.PrivateReferenceCount + reference.PublicReferenceCount;\n        }\n\n        if (referenceCount == 0)\n        {\n            // Free the object itself\n            ReleaseAsset(reference);\n\n            // Free all its referenced objects\n            foreach (var childReference in reference.References)\n            {\n                DecrementReference(childReference, false);\n            }\n        }\n        else if (publicReference && reference.PublicReferenceCount == 0)\n        {\n            // If there is no more public reference but object is still alive, let's kick a cycle GC","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs#L33-L69","documentation":"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.","triggerScenarios":"Thrown at sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs:51 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}