{"record":{"id":"4140fb2351f7792a","repo":"stride3d/stride","slug":"cannot-release-an-object-that-doesn-t-have-active-public","errorCode":null,"errorMessage":"Cannot release an object that doesn't have active public references. Load/Unload pairs must match.","messagePattern":"Cannot release an object that doesn't have active public references\\. Load/Unload pairs must match\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs","lineNumber":44,"sourceCode":"        }\n        else\n        {\n            reference.PrivateReferenceCount++;\n        }\n    }\n\n    /// <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)","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs#L26-L62","documentation":"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.","triggerScenarios":"Thrown at sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.ReferenceCounting.cs:44 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","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"],"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"}