小编Phi*_*tan的帖子

是否可以将boost shared_ptr从C++传递到Python并返回到C++

我有一个在C++中的shared_ptr中保存的对象.该对象是通过python中的python绑定访问的,并传递给另一个试图保持它的绑定C++函数.看来,当对象从C++转到Python时,它会从shared_ptr转换为python对象.然后,当它返回到C++时,它将从python对象转换为新的shared_ptr,但是这个shared_ptr与初始持有shared_ptr无关.

是否可以设置boost-python绑定,以便从python对象到shared_ptr的转换引用原始的shared_ptr内部?

下面是我用来显示问题的删节代码.

在此示例中,对象最初保存在名为s_inital的shared_ptr中.它是通过getSharedPtr函数从python中获取的,然后通过putSharedPtr函数推回到C++中.在putSharedPtr里面,它被复制到weak_ptr s_copied中.检查调试器中的指针显示putSharedPtr中使用的shared_ptr与s_initial没有相同的引用计数内部.最后的断言将触发,因为弱指针s_copied仅与单个强指针(putSharedPtr中使用的指针)相关,并且一旦putSharedPtr完成,该指针就被破坏了.

static shared_ptr<Captured> s_initial;
static weak_ptr<Captured> s_copied;

class UseSharedPtr
{
public:
    shared_ptr<Captured> getSharedPtr()
    {
        return s_initial;
    }

    void putSharedPtr(shared_ptr<Captured> ptr)
    {
        s_copied = ptr;
    }
};


BOOST_PYTHON_MODULE(test)
{
    class_<Captured, shared_ptr<Captured>, boost::noncopyable>("Captured", no_init);
    class_<UseSharedPtr, boost::noncopyable>("UseSharedPtr", init<>())
        .def("getSharedPtr", &UseSharedPtr::getSharedPtr)
        .def("putSharedPtr", &UseSharedPtr::putSharedPtr)
    ;
}



    s_initial = make_shared<Captured>();

    const char* chunk = "\
from test import UseSharedPtr \n\
x = UseSharedPtr() \n\
ptr = x.getSharedPtr() \n\
x.putSharedPtr(ptr)\n\
del x \n\
del ptr \n\
";
    object result = exec(chunk, mainNamespace, mainNamespace); …
Run Code Online (Sandbox Code Playgroud)

boost shared-ptr boost-python

9
推荐指数
1
解决办法
1322
查看次数

标签 统计

boost ×1

boost-python ×1

shared-ptr ×1