Python:passc++;对象,然后调用扩展c++;来自脚本的函数
首先,问题是程序失败,内存被双重释放 交易是: 我有 我把它传给我的剧本。它很好用。像这样:Python:passc++;对象,然后调用扩展c++;来自脚本的函数,python,reference-counting,Python,Reference Counting,首先,问题是程序失败,内存被双重释放 交易是: 我有 我把它传给我的剧本。它很好用。像这样: PyObject *pArgs, *pValue; pArgs = Py_BuildValue("((O))", obj); pValue = PyObject_CallObject(pFunc, pArgs); 其中pFunc是一个python函数。。。 所以,我的脚本有一个函数,我使用obj def main(args) ... pythonObj = FooPython(args[0])
PyObject *pArgs, *pValue;
pArgs = Py_BuildValue("((O))", obj);
pValue = PyObject_CallObject(pFunc, pArgs);
其中pFunc是一个python函数。。。
所以,我的脚本有一个函数,我使用obj
def main(args)
...
pythonObj = FooPython(args[0])
...
# hardcore calculation of "x"
...
...
pythonObj.doWork(x)
当然,我已经定义了python类
class FooPython:
def __init__(self, data):
self._base = data
def doWork(arg):
import extend_module
extend_module.bar(self._base, arg)
“ExpDub模块”是一个扩展C++模块,在这里我定义了函数“bar”。 我原以为“bar”函数可以正常工作,但结果却出现了内存错误:“双重内存释放或损坏”
以下是“条形图”功能:static PyObject* bar(PyObject *self, PyObject *args)
{
PyObject *pyFooObject = 0;
int arg;
int ok = PyArg_ParseTuple(args,"Oi",&pyRuleHandler, &arg);
if(!ok) return 0;
void * temp = PyCObject_AsVoidPtr(pyFooObject);
FooCPlusPlus* obj = static_cast<FooCPlusPlus*>(temp);
obj->method(arg); // some c++ method
return PyCObject_FromVoidPtr((void *) ruleHandler, NULL);
}
静态PyObject*条(PyObject*self,PyObject*args)
{
PyObject*pyFooObject=0;
int-arg;
int ok=PyArg\u语法元组(args,“Oi”、&pyRuleHandler、&arg);
如果(!ok)返回0;
void*temp=PyCObject_AsVoidPtr(pyFooObject);
fooclusplus*obj=静态铸件(温度);
Obj> >方法(C++)
从voidptr((void*)规则处理程序返回PyCObject_,NULL);
}
它在“bar”的返回语句中失败…好了,我终于知道问题出在哪里了: 我们应该从“bar”函数输入参数返回:
return args;
而不是
return PyCObject_FromVoidPtr((void *) ruleHandler, NULL);
你的代码中有很多错误,所以它应该在返回语句之前就失败了。伙计,当然,我在这里写了一个非常抽象的代码模型,以便于理解。我的问题是“代码包含哪些原则错误?”。明显的印刷错误在最后一行-我应该写“obj”而不是“ruleHandler”。但无论如何,我坚持代码在return语句中失败了,而不是之前。所以我猜你不明白我的问题。
return PyCObject_FromVoidPtr((void *) ruleHandler, NULL);