0

まず問題は、プログラムが二重のメモリ解放で失敗することです...

取引は:私は持っています

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)

もちろん、私はpythonクラスを定義しました

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

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

「Extend_module」は、関数「bar」を定義した拡張 C++ モジュールです。

「bar」機能が正常に動作することを期待していましたが、代わりにメモリエラーが発生しました:「メモリが2つ解放されているか破損しています」。

「バー」関数は次のとおりです。

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

「bar」の return ステートメントで失敗します...

4

1 に答える 1

0

さて、最終的に私は問題がどこにあったかを知っています:

「bar」関数の入力引数から戻る必要があります。

return args;

それ以外の

return PyCObject_FromVoidPtr((void *) ruleHandler, NULL);
于 2009-09-28T16:30:23.627 に答える