2009-09-28 33 views
0

首先的功能,問題是,程序無法與雙內存釋放...的Python:通C++對象的腳本,然後調用擴展C++,從腳本

該協議是: 我

FooCPlusPlus *obj; 

我將它傳遞給我的腳本。它工作正常。就像這樣:

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) 

當然我定義蟒類

class FooPython: 
    def __init__(self, data): 
    self._base = data  

    def doWork(arg): 
    import extend_module 
    extend_module.bar(self._base, arg) 

「Extend_module」 是我已經定義函數 「欄」 的擴展的C++模塊。

我預計「酒吧」功能可以正常工作,但代替它,我得到了內存錯誤:「雙內存空閒或腐敗」。

這裏是 「欄」 功能:

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

它未能在 「酒吧」 的return語句...

+0

代碼中存在很多錯誤,所以在返回語句之前應該會失敗。 – 2009-09-28 14:04:59

+0

老兄,當然我在這裏寫了一個非常抽象的代碼模型,以便於理解。 我的問題是「代碼包含什麼原則性錯誤?」。 明顯的印刷錯誤是在最後一行 - 我應該寫「obj」而不是「ruleHandler」。 但無論如何,我堅持認爲代碼在返回聲明失敗,而不是之前。 所以我想你不明白我的問題。 – Nelly 2009-10-08 16:20:34

回答

0

好了,終於我知道那裏的問題是:

我們應該從 「欄」 功能輸入ARGS返回:

return args; 

,而不是

return PyCObject_FromVoidPtr((void *) ruleHandler, NULL);