hlu*_*u58 3 c++ python 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 *>());
}
Run Code Online (Sandbox Code Playgroud)
然后在 python 中,我将按如下方式使用它们:
b = B()
a = A(b)
Run Code Online (Sandbox Code Playgroud)
只要我不删除就可以了。当我在Python中del a时,我在C++的“A”中创建的shared_ptr mb将尝试销毁由Python管理的B对象并崩溃。所以,我的问题是 C++ 中是否有一些智能指针不从原始指针获取所有权?weak_ptr 不起作用,因为我仍然需要创建一个shared_ptr。
Pybind11 在幕后使用唯一的指针来管理 C++ 对象,因为它认为它拥有该对象,并且每当 Python 包装器对象被释放时就应该释放该对象。但是,您正在与 C++ 代码库的其他部分共享此指针。因此,您需要使 B 类的 Python 包装器使用共享指针来管理 B 的实例。您可以在 withclass_模板中执行此操作。例如。
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> >());
}
Run Code Online (Sandbox Code Playgroud)
https://pybind11.readthedocs.io/en/stable/advanced/smart_ptrs.html#std-shared-ptr