通过 Boost Python 在 C++ 对象之间传递共享指针的段错误
Segfault from passing a shared pointer between C++ objects via Boost Python
我有两个自定义 C++ classes Foo
和 Baz
,我已经通过 Boost Python 成功地暴露给 Python;用户与 Python classes 交互,运行 他们的 C++ 对手在引擎盖下。一个重要的用例是将 Foo
Python 实例传递给 Python 方法 Baz.run_that_foo
。 Python 绑定方法是,
// Note `XPython` is the name for the Boost Python bindings class of `X`.
void BazPython::RunThatFoo(const bp::object & foo) {
FooPython & foo_obj = bp::extract<FooPython&>(foo);
auto ps_ptr = foo_obj.GetPSPtr();
Baz::DoPSComputation(ps_ptr); // Expects a `const std::shared_ptr<planning_scene::PlanningScene>`
}
重要的是,ps_ptr
应该是指向 PlanningScene 实例(即 std::shared_ptr<planning_scene::PlanningScene>
)的共享指针,其中 class 声明为,
class PlanningScene : private boost::noncopyable, public std::enable_shared_from_this<PlanningScene>
在 C++ 中 Foo
class 我有,
std::shared_ptr<planning_scene::PlanningScene> Foo::GetPSPtr() { // two different attempts shown
// return ps_;
return (*ps_).shared_from_this();
}
其中 ps_
是指向通过 Foo
构造函数中的 std::make_shared
创建的 PlanningScene 实例的有效共享指针。
运行 一些 C++ 集成测试工作正常,我在 C++ 中直接将 foo_ptr
从 Foo
传递到 Baz
。但是 python 集成测试(使用绑定 class)在 Segmentation fault (core dumped)
上失败了。这里有什么问题?我已经在 Boost Python 段错误、enable_shared_from_this
等方面挖掘了许多 SO 问题,但无济于事。提前致谢!
诀窍是使用 boost::bind
围绕我们从 Python-绑定 class(即 FooPython.GetPSPtr
)调用的方法生成转发调用包装器:
void BazPython::RunThatFoo(const bp::object & foo) {
FooPython & foo_obj = bp::extract<FooPython&>(foo);
Baz::DoPSComputation(boost::bind(&Foo::GetPSPtr, &foo_obj)());
}
我有两个自定义 C++ classes Foo
和 Baz
,我已经通过 Boost Python 成功地暴露给 Python;用户与 Python classes 交互,运行 他们的 C++ 对手在引擎盖下。一个重要的用例是将 Foo
Python 实例传递给 Python 方法 Baz.run_that_foo
。 Python 绑定方法是,
// Note `XPython` is the name for the Boost Python bindings class of `X`.
void BazPython::RunThatFoo(const bp::object & foo) {
FooPython & foo_obj = bp::extract<FooPython&>(foo);
auto ps_ptr = foo_obj.GetPSPtr();
Baz::DoPSComputation(ps_ptr); // Expects a `const std::shared_ptr<planning_scene::PlanningScene>`
}
重要的是,ps_ptr
应该是指向 PlanningScene 实例(即 std::shared_ptr<planning_scene::PlanningScene>
)的共享指针,其中 class 声明为,
class PlanningScene : private boost::noncopyable, public std::enable_shared_from_this<PlanningScene>
在 C++ 中 Foo
class 我有,
std::shared_ptr<planning_scene::PlanningScene> Foo::GetPSPtr() { // two different attempts shown
// return ps_;
return (*ps_).shared_from_this();
}
其中 ps_
是指向通过 Foo
构造函数中的 std::make_shared
创建的 PlanningScene 实例的有效共享指针。
运行 一些 C++ 集成测试工作正常,我在 C++ 中直接将 foo_ptr
从 Foo
传递到 Baz
。但是 python 集成测试(使用绑定 class)在 Segmentation fault (core dumped)
上失败了。这里有什么问题?我已经在 Boost Python 段错误、enable_shared_from_this
等方面挖掘了许多 SO 问题,但无济于事。提前致谢!
诀窍是使用 boost::bind
围绕我们从 Python-绑定 class(即 FooPython.GetPSPtr
)调用的方法生成转发调用包装器:
void BazPython::RunThatFoo(const bp::object & foo) {
FooPython & foo_obj = bp::extract<FooPython&>(foo);
Baz::DoPSComputation(boost::bind(&Foo::GetPSPtr, &foo_obj)());
}