通过 Boost Python 在 C++ 对象之间传递共享指针的段错误

Segfault from passing a shared pointer between C++ objects via Boost Python

我有两个自定义 C++ classes FooBaz,我已经通过 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_ptrFoo 传递到 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)());
}