如何阻止pybind11释放由Python构造的对象?

如何阻止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

所以,我知道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_& m);

};
void PyComponent::PyInitialize(py::module_Um&m)
{
py::类_m(组件)
.def(py::init(&PyComponent::Create),py::return\u value\u policy::reference)
;
}

但是,如果我调用
Component()
并且创建的对象超出范围,这并不会阻止我的组件类型从Python端被释放。有什么建议吗?

我确实找到了解决办法。它将
py::nodelete
传递给我的类的包装器

void PyComponent::PyInitialize(py::module_ & m)
{
    py::class_<Component, std::unique_ptr<Component, py::nodelete>>(m, "Component")
        .def(py::init<>(&PyComponent::Create), py::return_value_policy::reference)
        ;
}
void PyComponent::PyInitialize(py::module_Um&m)
{
py::类_m(组件)
.def(py::init(&PyComponent::Create),py::return\u value\u policy::reference)
;
}
void PyComponent::PyInitialize(py::module_ & m)
{
    py::class_<Component, std::unique_ptr<Component, py::nodelete>>(m, "Component")
        .def(py::init<>(&PyComponent::Create), py::return_value_policy::reference)
        ;
}