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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions