C++中的回调Python函数,对象破坏

2024-10-05 10:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

< P>我执行一段Python代码来生成C++对象并回调Python函数,然后将这个对象返回到Python,为什么对象被破坏?你知道吗

我使用Boost Python来包装C++程序并用Python创建一个对话框。然后单击一个按钮,回调Python函数,返回这个对象指针到这个函数,但是对象成员数据似乎全部清除了

class MyObj
{
public:
   OtherThing();
   ConnectFunc(boost::python::object callbackfun){m_pyCallbackFunc=callbackfun;}
   //some operation will call below function 
   DoSomething(){m_pyCallbackFunc(this)}
private:
   boost::python::object m_pyCallbackfunc;
   vector<int> m_vecData;
}

def callback(myobject):
   #call my object functions again 
   myobject.Otherthing()

//first generate C++ object by python ,such as 
obj=MyObj
obj.ConnectFunc(callback)....

一切正常,但当执行OtherThing()函数时,成员数据 mu vecData已清除。我在调用python函数“callback”时发现, MyObj将调用销毁函数,因此数据已被清除

有谁能帮我避免它,我想保留它?或者任何人给我好主意


Tags: 数据对象函数objectcallback成员callboost
1条回答
网友
1楼 · 发布于 2024-10-05 10:54:51

执行以下操作时:

DoSomething(){m_pyCallbackFunc(this)}

您的m_pyCallbackFunc从它的副本接收一个新的代理对象,这意味着它接收的对象不是DoSomething接收的对象。假设您有以下类:

class Foo
{
public:
    boost::python::object bar()
    {
        return boost::python::object(boost::python::ptr(this));
    }
};

导出如下:

boost::python::class_<Foo>("Foo")
    .def(
        "bar",
        &Foo::bar
    );

可以肯定地假设foo.bar()将返回foo,但事实并非如此。以下操作将引发断言错误:

foo = Foo()
assert foo is foo.bar()

因为返回的是一个新的代理对象。如果要将同一对象传递回Python,则必须声明您的类(如Boost know ithas back references)或my favorite;将方法声明为static并提取实例:

class Foo
{
public:
    static boost::python::object bar(boost::python::object self)
    {
        Foo &pSelf = boost::python::extract<Foo &>(self);
        return self;
    }
};

现在,上面的代码将不再引发断言错误,因为返回的对象与接收到的对象相同。基本上,调用析构函数是因为代理对象生成的副本超出范围并被释放。你知道吗

相关问题 更多 >

    热门问题