Hacker News new | ask | show | jobs
by kevingadd 1750 days ago
Aside from whether this should be fixed, that's a classical problem not unique to godot: https://en.wikipedia.org/wiki/ABA_problem

The real problem is that you are not properly managing the lifetime of your objects so you have dangling references. Obviously Godot could provide better tooling to help you identify and troubleshoot it, but dangling references like that will cause breakage in basically any runtime environment that makes it possible to have them.

IDs of that sort can be reused in many environments. For example, if you use Unity, .NET GCHandle IDs can be reused in the exact same way.

1 comments

Sure, there are easy workarounds, but the issues are unexpected and secret (and now only in release). In any other scripting language I've worked on you can do some test on a reference to see if its null or doesn't exist. In Godot you have to listen for the object reference leaving the scene.

I can guarantee this is not an issue in Unity where a object that has been removed from the scene is null.

As it happens, Unity has its own version of this problem, where it pretends that a non-null dangling reference is a null-reference: https://jacx.net/2015/11/20/dont-use-equals-null-on-unity-ob...
That is not the same at all. The equivalent would be that your reference is pointing to some other object in the scene.
> In any other scripting language I've worked on you can do some test on a reference to see if its null or doesn't exist.

Except - and this is called out in the github thread - the reference is not null and does exist. The check is working correctly.

The problem lies in the fact that what you want to check for is "is the object I originally pointed to still around?", but instead of doing that, you're checking "is the thing I'm pointing to currently a valid object?".

Yes, but read further, there is no method to test whether the object I pointed to still exists. You have to listen for a signal that the object is leaving the scene and manually clear your reference.
https://docs.godotengine.org/en/stable/classes/class_%40gdsc...

I'm making a complex Godot game.

'is_instance_valid' does what you are describing.

Only in Debug builds. If you rely on it in a release build you will crash.

https://github.com/godotengine/godot-proposals/issues/1589 https://github.com/godotengine/godot/issues/41179

Reduz doesn't want the fix in release builds because the will be slower!

I don't understand. That's not what that PR says. That PR is about using == null. It offers no substantial information about is_instance_valid.
> there is no method to test whether the object I pointed to still exists

There probably is such a method, but you'd have to invoke it on the object, not on some other unrelated object.