Как мне остановить pybind11 от освобождения объекта, созданного на Python?

#python #c #pybind11

#python #c #pybind11

Вопрос:

Итак, я знаю, что pybind позволяет вам устанавливать политику возвращаемого значения для методов, которые вы завершаете. Однако, похоже, это не работает для меня, когда я пытаюсь использовать эту политику в конструкторе. У меня есть класс для переноса моего типа C , который выглядит следующим образом:

 class PyComponent{
public:


    static Component* Create(ComponentType type) {
        Component* c = new Component(type);
        // Irrelevant stuff removed here
        return c;
    }

    /// @brief Wrap a behavior for Python
    static void PyInitialize(py::module_amp; m);

};
 
 void PyComponent::PyInitialize(py::module_ amp; m)
{
    py::class_<Component>(m, "Component")
        .def(py::init<>(amp;PyComponent::Create), py::return_value_policy::reference)
        ;
}
 

Однако это НЕ останавливает освобождение моего типа компонента со стороны Python, если я вызываю Component() , и созданный объект выходит из области видимости. Есть предложения?

Ответ №1:

Я нашел решение этой проблемы. Он должен перейти py::nodelete к оболочке для моего класса

 void PyComponent::PyInitialize(py::module_ amp; m)
{
    py::class_<Component, std::unique_ptr<Component, py::nodelete>>(m, "Component")
        .def(py::init<>(amp;PyComponent::Create), py::return_value_policy::reference)
        ;
}