まず問題は、プログラムが二重のメモリ解放で失敗することです...
取引は:私は持っています
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 ステートメントで失敗します...