代码之家  ›  专栏  ›  技术社区  ›  hlu58

指向外部托管(例如:Python)资源的C++智能指针?

  •  0
  • hlu58  · 技术社区  · 7 年前

    C++中有智能指针到其他人管理的资源吗?我使用PybDun11来包装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中删除A时,在C++的“A”中创建的SysDypPTR MB将尝试销毁由Python和Read管理的B对象。所以,我的问题是,C++中是否有一个智能指针不能从原始指针获得所有权?弱指针不起作用,因为我仍然需要创建一个共享指针。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dunes    7 年前

    PybDn11在场景中使用一个唯一的指针来管理C++对象,因为它认为它拥有对象,并且每当Python包装器对象被释放时应该释放对象。但是,您与C++代码库的其他部分共享这个指针。因此,您需要使B类的python包装器使用共享指针来管理B的实例。你可以用 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

    推荐文章