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