-
-
Notifications
You must be signed in to change notification settings - Fork 743
Parameter "_p" is null at: Dictionary::_unref #1949
Description
Godot version
4.6.1
godot-cpp version
10.0.0-rc1
System information
Windows 11
Issue description
I have godot-cpp method that returns a dictionary. I noticed that when it is called I see an error logged.
ERROR: Parameter "_p" is null.
at: Dictionary::_unref (core\variant\dictionary.cpp:356)
C# backtrace (most recent call first):
[0] Godot.Collections.Dictionary Godot.NativeCalls.godot_icall_0_122(nint, nint)
omitted the rest
When debugging the native code I can see that it is a problem after the godot::Dictionary is returned from my method. The calling code creates a godot-cpp Dictionary and then invokes the assignment operator. This assignment operator calls the godot Engine Dictionary's destructor explicitly, and that calls _unref which has the ref check. Because this is a newly constructed object there is no ref count and ERR_FAIL_NULL catches that.
I see there is a move assignment available for Dictionary. That might be more appropriate in this case. Alternatively, I think the godot-cpp Dictionary class shouldn't call the destructor for the engine Dictionary when it will fail.
Steps to reproduce
Bind a method that returns a godot::Dictionary and call it. Observe that the error is logged.
Minimal reproduction project
static void _bind_methods() noexcept {
godot::ClassDB::bind_method(godot::D_METHOD("get_dictionary_test"), &MrLinkPlatform::GetDictionaryTest);
}
godot::Dictionary GetDictionaryTest() const noexcept {
godot::Dictionary dict;
dict["key"] = "value";
return dict;
}