首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pybind11将堆分配指针的` `std::vector`传递给python?

如何使用pybind11将堆分配指针的` `std::vector`传递给python?
EN

Stack Overflow用户
提问于 2020-07-23 13:50:01
回答 1查看 137关注 0票数 0

假设我现在有一堆指针foo*,我想在c++函数get_foos中使用std::vector将它们传递给python,但我想在c++中的向量中管理这些堆分配的指针的生命周期,也就是说,当c++向量foos超出python的作用域时,python应该只释放向量,而不释放这些指针。

return_value_policy::reference似乎还不够,因为它也不会破坏向量,如果我错了,请纠正我。

代码语言:javascript
复制
struct foo {};

py::class_<foo>(m, "Foo");

auto get_foos() -> std::vector<foo*> {
  auto foos = std::vector<foo*> {};

  for(...) {
    auto p = get_foo_ptr(...);
    foos.emplace_back(p);
  }
  return foos;
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-25 03:44:28

有一个帮助器标头,您必须包含<pybind11/stl.h>

下面是一个例子:

代码语言:javascript
复制
struct Foo {
    Foo(const char *name) : m_name(name) {}
    ~Foo() {}

    const char *get_name() const { return m_name.c_str(); }

private:
    string m_name;
};

vector<unique_ptr<Foo>> make_foos() {
    vector<unique_ptr<Foo>> foos;
    foos.push_back(make_unique<Foo>("Hello"));
    foos.push_back(make_unique<Foo>("World"));
    return foos;
}

vector<Foo *> get_foos() {
    static vector<unique_ptr<Foo>> all_foos = make_foos();

    vector<Foo *> foos;
    for (unique_ptr<Foo> &foo : all_foos) {
        foos.push_back(foo.get());
    }
    return foos;
}


PYBIND11_MODULE(example, m) {
    py::class_<Foo>(m, "Foo")
            .def("get_name", &Foo::get_name);

    m.def("get_foos", get_foos, py::return_value_policy::reference);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63047691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档