python - 指向外部托管的 C++ 智能指针(例如 : Python) resources?

标签 python c++ pybind11

C++ 中是否有智能指针指向其他人管理的资源?我正在使用 pybind11 来包装 C++ 代码,如下所示。

    class B {};
    class A {
      public:
        // original C++ class interface
        A(std::shared_ptr<B> pb) : mb(pb){}
        // have to add this for pybind11, since pybind11 doesn't take shared_ptr as argument.
        A(B * pb):A(std::shared_ptr<B>(pb)){}
      private:
        std::shared_ptr<B> mb;
    }
    namespace py = pybind11;
    PYBIND11_MODULE(test, m)
    {
       py::class_<B>(m, "B")
       .def(py::init<>());

       py::class_<A>(m, "A")
       .def(py::init<B *>());
    }

然后在 python 中,我将按如下方式使用它们:

    b = B()
    a = A(b)

只要我不删除就可以了。当我在 python 中 del a 时,我在 C++ 的“A”中创建的 shared_ptr mb 将尝试破坏由 Python 管理的 B 对象并崩溃。所以,我的问题是 C++ 中是否有一些不从原始指针获取所有权的智能指针? weak_ptr 不会工作,因为我仍然需要创建一个 shared_ptr。

最佳答案

Pybind11 在幕后使用一个唯一的指针来管理 C++ 对象,因为它认为它拥有该对象,并且应该在 Python 包装器对象被释放时释放该对象。但是,您正在与 C++ 代码库的其他部分共享此指针。因此,您需要使 B 类的 Python 包装器使用共享指针来管理 B 的实例。您可以在 with class_ 模板中执行此操作。例如。

PYBIND11_MODULE(test, m)
{
   py::class_<B, std::shared_ptr<B> >(m, "B")
   .def(py::init<>());

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

https://pybind11.readthedocs.io/en/stable/advanced/smart_ptrs.html#std-shared-ptr

关于python - 指向外部托管的 C++ 智能指针(例如 : Python) resources?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53786965/

相关文章:

c# - STL双端队列是作为循环链表实现的吗?

c++ - _iterator_debug_level 值 '0' 与值 '2' 不匹配

c++ - 来自 n3290 :Argument-dependent name lookup 的一个点

python - pybind11::array_t 是否有(深)复制构造函数?

python - 有没有办法在守护进程模式下运行 Bottle 应用程序

python - 修改Python导入脚本的命名空间

python - 使用 pybind11 将 NumPy 数组转换到自定义 C++ 矩阵类或从自定义 C++ 矩阵类转换

python - pybind11::dict 中的 pybind11::对象

Python 覆盖我的文件并且找不到其他文件

python - 电影全屏