Python C API を使用するときに参照カウントを処理する方法を理解しようとしています。
次のように、C++ で Python 関数を呼び出したいとします。
PyObject* script;
PyObject* scriptRun;
PyObject* scriptResult;
// import module
script = PyImport_ImportModule("pythonScript");
// get function objects
scriptRun = PyObject_GetAttrString(script, "run");
// call function without/empty arguments
scriptResult = PyObject_CallFunctionObjArgs(scriptRun, NULL);
if (scriptResult == NULL)
cout << "scriptResult = null" << endl;
else
cout << "scriptResult != null" << endl;
cout << "print reference count: " << scriptResult->ob_refcnt << endl;
pythonScript.py の Python コードは非常に単純です。
def run():
return 1
「PyObject_CallFunctionObjArgs」のドキュメントには、戻り値として新しい参照を取得すると書かれています。したがって、「scriptResult」の参照カウントは 1 であると予想されます。しかし、出力は次のようになります。
scriptResult != null
print reference count: 72
さらに、参照カウントを減らさずにループでこれを行うと、メモリ リークが発生することが予想されます。しかし、これは起こらないようです。
誰かが私を理解するのを手伝ってもらえますか?
敬具!