无法从pybind11中的静态函数返回shared_ptr

时间:2019-05-07 07:57:52

标签: python c++ pybind11

我试图绑定一个静态函数,该函数返回指向另一个类的shared_ptr。

这是示例代码

class Example {
  public:
    Example() {}
    ~Example() {}
};

class ABC {
  public:
    static std::shared_ptr<Example> get_example() {std::make_shared<Example();}
 };

void init_abc(py::module & m) {
  py::class_<Example>(m, "Example")
    .def(py::init<>());

  py::class_<ABC>(m, "ABC")
    .def_static("get_example", &ABC::get_example);
}

这是python方面

example = my_module.ABC.get_example()

但是,python方面抛出了分段错误。

有什么主意吗?

2 个答案:

答案 0 :(得分:0)

您应该使class Example公开继承自std::enable_shared_from_this<Example>

  

std::enable_shared_from_this允许当前由名为t的{​​{1}}管理的对象std::shared_ptr安全地生成其他pt实例std::shared_ptr,{ {1}},...都与pt1共享pt2的所有权。

注意:

  • 您需要包括t标头才能使用pt
  • 您需要在<memory>成员函数

    中使用std::enable_shared_from_this语句

    return

答案 1 :(得分:0)

您的代码中有些遗漏的地方,例如>。这是工作示例:

class Example {
public:
    Example() {}
    ~Example() {}
};

class ABC {
public:
    static std::shared_ptr<Example> get_example() { return std::make_shared<Example>();}
};

接下来,在包装shared_ptr<Example>类的位置提供其他模板参数Example

py::class_<Example, std::shared_ptr<Example>>(m, "Example")
    .def(py::init<>());

py::class_<ABC>(m, "ABC")
    .def_static("get_example", &ABC::get_example);

这样shared_ptr<Example>将得到正确处理。