Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过C&x2B+;使用boost将对象转换为python 我试图找出如何使用Boost Python在C++中创建一个对象并将其传递到Python中。我成功地做到了这一点,但之后无法进行垃圾收集 设想类A是用C++定义的。passNewAToPython()函数是从代码中的其他地方调用的,该代码创建一个对象,然后将其传递给Python中的回调函数。我希望将特定实例传递给python,而不是副本,因此使用ptr()_C++_Python_Boost_Boost Python - Fatal编程技术网

通过C&x2B+;使用boost将对象转换为python 我试图找出如何使用Boost Python在C++中创建一个对象并将其传递到Python中。我成功地做到了这一点,但之后无法进行垃圾收集 设想类A是用C++定义的。passNewAToPython()函数是从代码中的其他地方调用的,该代码创建一个对象,然后将其传递给Python中的回调函数。我希望将特定实例传递给python,而不是副本,因此使用ptr()

通过C&x2B+;使用boost将对象转换为python 我试图找出如何使用Boost Python在C++中创建一个对象并将其传递到Python中。我成功地做到了这一点,但之后无法进行垃圾收集 设想类A是用C++定义的。passNewAToPython()函数是从代码中的其他地方调用的,该代码创建一个对象,然后将其传递给Python中的回调函数。我希望将特定实例传递给python,而不是副本,因此使用ptr(),c++,python,boost,boost-python,C++,Python,Boost,Boost Python,现在想象一下,在调用newA回调之后的一段时间。我希望存储实例的唯一位置是在\u列表中。因此,如果我从AAL列表中删除一个,那么我希望在我用新创建的对象上调用C++删除。这永远不会发生,所以我泄漏对象 我尝试了许多不同的技术来实现这一点,但从来没有成功地使所有的工作。我非常希望能有一个完整的示例来演示如何修改上面的示例。我非常确定ptr()与所指向对象的生命周期无关。如果你使用它,完全由你来管理你的一生。(我相信使用它就像使用PyCObject一样。) 您可以做的是将A的指针类型定义为共享_pt

现在想象一下,在调用newA回调之后的一段时间。我希望存储实例的唯一位置是在\u列表中。因此,如果我从AAL列表中删除一个,那么我希望在我用新创建的对象上调用C++删除。这永远不会发生,所以我泄漏对象


我尝试了许多不同的技术来实现这一点,但从来没有成功地使所有的工作。我非常希望能有一个完整的示例来演示如何修改上面的示例。

我非常确定
ptr()
与所指向对象的生命周期无关。如果你使用它,完全由你来管理你的一生。(我相信使用它就像使用PyCObject一样。)

您可以做的是将A的指针类型定义为共享_ptr(boost或std都不重要)。大概是这样的:

class_<A, shared_ptr<A>, boost:noncopyable>("A", init<>());
类(“A”,init()); 然后,您可以让工厂功能执行以下操作:

void passNewAToPython()
{
    A * a = make_shared<A>();
    PyGILState_STATE _GILState = PyGILState_Ensure();     
    //Should really use a try catch here too but lets ignore that for now
    boost::python::call_method<void>(pythonCallbacks, "newA", a);
    PyGILState_Release(_GILState);
 }
void passNewAToPython()
{
A*A=使_共享();
PyGILState_STATE _GILState=PyGILState_sure();
//这里也应该使用try-catch,但现在我们忽略它
boost::python::call_方法(pythonCallbacks,“newA”,a);
PyGILState_释放(_GILState);
}

我不熟悉Boo::Python,但是你在哪里释放C++上的Python对象引用计数?如何在C++侧释放Python对象引用计数?我见过BOOST和pythonapi命令用于增加/减少引用计数,但它们只在Python对象上运行。在这里,python对象是在call_method函数中创建的。在call_方法完成后,我希望通过Python存在对对象的唯一引用,这样当所有Python引用都消失时,对象就会被删除。我确实尝试过用指针创建一个boost::python::object,然后调用increase/decrease,但我通常只是遇到了一个崩溃。因此,您专门转移了对象的所有权,在这种情况下,您应该减少引用计数,除非目标方法不增加引用计数。您有没有看过PythonQt?将C++对象封装到Python非常简单!
class_<A, shared_ptr<A>, boost:noncopyable>("A", init<>());
void passNewAToPython()
{
    A * a = make_shared<A>();
    PyGILState_STATE _GILState = PyGILState_Ensure();     
    //Should really use a try catch here too but lets ignore that for now
    boost::python::call_method<void>(pythonCallbacks, "newA", a);
    PyGILState_Release(_GILState);
 }