Segfault通过Boost Python在C ++对象之间传递共享指针

时间:2018-05-06 16:31:53

标签: c++ boost-python

我有两个自定义C ++类if (out[0] > price) { console.log('more'); document.getElementById('btc').innerHTML = out[0]; document.getElementById('btc').style.color = "green"; } else { console.log('less'); price = out[0]; document.getElementById('btc').innerHTML = out[0]; document.getElementById('btc').style.color = "red"; } Foo,我已经通过Boost Python成功地向Python公开了这些类;用户与在其下运行C ++对应项的Python类进行交互。一个重要的用例是将Baz Python实例传递给Python方法Foo。 Python绑定方法是,

Baz.run_that_foo

重要的是,// 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>` } 应该是指向PlanningScene实例的共享指针(即ps_ptr),其中该类被声明为,

std::shared_ptr<planning_scene::PlanningScene>

在我的C ++ class PlanningScene : private boost::noncopyable, public std::enable_shared_from_this<PlanningScene> 课程中,

Foo

其中std::shared_ptr<planning_scene::PlanningScene> Foo::GetPSPtr() { // two different attempts shown // return ps_; return (*ps_).shared_from_this(); } 是指向ps_构造函数中std::make_shared创建的PlanningScene实例的有效共享指针。

运行一些C ++集成测试工作正常,我将Foo直接在C ++中从foo_ptr传递给Foo。但是Baz上的python集成测试(使用绑定类)失败了。这可能有什么问题?我在Boost Python段错误,Segmentation fault (core dumped)等方面挖掘了许多SO问题,但无济于事。提前谢谢!

1 个答案:

答案 0 :(得分:1)

诀窍是使用boost::bind围绕我们从Python绑定类(即FooPython.GetPSPtr)调用的方法生成转发调用包装器:

void BazPython::RunThatFoo(const bp::object & foo) {
    FooPython & foo_obj = bp::extract<FooPython&>(foo);
    Baz::DoPSComputation(boost::bind(&Foo::GetPSPtr, &foo_obj)());
}