diff --git a/Source/Editor/Managed/ManagedEditor.cpp b/Source/Editor/Managed/ManagedEditor.cpp index 652878d4d..afa47a159 100644 --- a/Source/Editor/Managed/ManagedEditor.cpp +++ b/Source/Editor/Managed/ManagedEditor.cpp @@ -606,6 +606,11 @@ void ManagedEditor::WipeOutLeftoverSceneObjects() { if (sceneObject->HasParent()) continue; // Skip sub-objects + auto* actor = Cast(sceneObject); + if (!actor) + actor = sceneObject->GetParent(); + if (actor && actor->HasTag(TEXT("__EditorInternal"))) + continue; // Skip internal objects used by Editor (eg. EditorScene) LOG(Error, "Object '{}' (ID={}, Type={}) is still in memory after play end but should be destroyed (memory leak).", sceneObject->GetNamePath(), sceneObject->GetID(), sceneObject->GetType().ToString()); sceneObject->DeleteObject(); diff --git a/Source/Editor/Utilities/EditorScene.cpp b/Source/Editor/Utilities/EditorScene.cpp index e42580111..88d0cd5e3 100644 --- a/Source/Editor/Utilities/EditorScene.cpp +++ b/Source/Editor/Utilities/EditorScene.cpp @@ -10,6 +10,9 @@ EditorScene::EditorScene(const SpawnParams& params) SceneBeginData beginData; EditorScene::BeginPlay(&beginData); beginData.OnDone(); + + // Mark as internal to prevent collection in ManagedEditor::WipeOutLeftoverSceneObjects + Tags.Add(Tags::Get(TEXT("__EditorInternal"))); } void EditorScene::Update() diff --git a/Source/Editor/Windows/Assets/AudioClipWindow.cs b/Source/Editor/Windows/Assets/AudioClipWindow.cs index 35072620b..0bb52c7ab 100644 --- a/Source/Editor/Windows/Assets/AudioClipWindow.cs +++ b/Source/Editor/Windows/Assets/AudioClipWindow.cs @@ -1,6 +1,5 @@ // Copyright (c) 2012-2024 Wojciech Figat. All rights reserved. -using System.IO; using System.Xml; using FlaxEditor.Content; using FlaxEditor.Content.Import; diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 4731a088d..a0b55376f 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -732,7 +732,12 @@ Array Scripting::GetObjects() { Array objects; _objectsLocker.Lock(); +#if USE_OBJECTS_DISPOSE_CRASHES_DEBUGGING + for (const auto& e : _objectsDictionary) + objects.Add(e.Value.Ptr); +#else _objectsDictionary.GetValues(objects); +#endif _objectsLocker.Unlock(); return objects; }