невозможно вернуть shared_ptr из статической функции в pybind11 - PullRequest
2 голосов
/ 07 мая 2019

Я пытался связать статическую функцию, которая возвращает 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 вызвала ошибку сегментации.

Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2019

Вы должны сделать class Example открытым наследованием от std::enable_shared_from_this<Example>.

std::enable_shared_from_this разрешить объект t, который в настоящее время управляется std::shared_ptr с именемpt для безопасного создания дополнительных std::shared_ptr экземпляров pt1, pt2, ..., которые все владеют t с pt.

Примечание:

  • Вам необходимо включить заголовок <memory>, чтобы использовать std::enable_shared_from_this
  • Вам нужен оператор return в get_example функции-члене

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

...