summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorIgnacio Etcheverry <ignalfonsore@gmail.com>2019-12-25 19:33:59 +0100
committerIgnacio Etcheverry <ignalfonsore@gmail.com>2019-12-25 19:33:59 +0100
commit0ef635c0e33fb925cdf12093da90d3977b23e107 (patch)
tree5d782b251797514757d359ab2818a49a47e80035 /modules
parent78f1513928bd5a683f0a0b40d4a4fec42fb1d4f3 (diff)
Mono/C#: Fix memory leak with new Reference instances created from C#
Diffstat (limited to 'modules')
-rw-r--r--modules/mono/mono_gd/gd_mono_internals.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/modules/mono/mono_gd/gd_mono_internals.cpp b/modules/mono/mono_gd/gd_mono_internals.cpp
index 3324ecb3a8..5b50f735e0 100644
--- a/modules/mono/mono_gd/gd_mono_internals.cpp
+++ b/modules/mono/mono_gd/gd_mono_internals.cpp
@@ -73,7 +73,7 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) {
script_binding.inited = true;
script_binding.type_name = NATIVE_GDMONOCLASS_NAME(klass);
script_binding.wrapper_class = klass;
- script_binding.gchandle = MonoGCHandle::create_strong(managed);
+ script_binding.gchandle = ref ? MonoGCHandle::create_weak(managed) : MonoGCHandle::create_strong(managed);
script_binding.owner = unmanaged;
if (ref) {
@@ -81,7 +81,9 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) {
// This way if the unmanaged world has no references to our owner
// but the managed instance is alive, the refcount will be 1 instead of 0.
// See: godot_icall_Reference_Dtor(MonoObject *p_obj, Object *p_ptr)
- ref->reference();
+
+ // May not me referenced yet, so we must use init_ref() instead of reference()
+ ref->init_ref();
}
// The object was just created, no script instance binding should have been attached