Skip to content

Parameter "_p" is null at: Dictionary::_unref #1949

@kael-msft

Description

@kael-msft

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;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions