Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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
Python:passc++;对象,然后调用扩展c++;来自脚本的函数_Python_Reference Counting - Fatal编程技术网

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);