Sadece Python C API'sini kullanırken referans sayımlarının nasıl ele alınacağını anlamaya çalışıyorum.Python C API, Yeni Nesne için yüksek referans sayısı
böyle, C++, Python işlevi çağırmak istiyorum:
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 içinde
Python kodu çok basit:
def run():
return 1
"PyObject_CallFunctionObjArgs" dokümantasyonu söylüyor Dönüş değeri olarak yeni bir referans alırsınız. Ben başvuru sayısı düşürmeden bir döngü içinde bunu olsaydı
scriptResult != null
print reference count: 72
Ayrıca ben bir bellek sızıntısı beklenir: çıkışı Ancak Yani 1. başvuru sayısı olması "scriptResult" beklenebilir. Ancak bu olmayacak gibi görünüyor.
Birisi anlayamama yardımcı olabilir mi?
Saygılarımızla!
Takip eden bir soru: @ecatmur ve @KayZhu'ya teşekkürler Artık neden bellek sızıntısı olmadığını anlıyorum. Yine de bu kodu uzun bir döngüde çalıştırırsam, tamamen os ezerim. '1' referans sayısı artmaktadır, her yineleme, ancak bunun neden bir sistem arızasına neden olacağını görmüyorum. – user1774143
'ob_refcnt' 0'a geri dönene kadar döngü mü yapıyorsun? 1 referans sayısı çok dalgalanır. 0'a yaklaştığınız zaman, normal işlemler Py_DECREF '0'a ve 'int'1'in serbest bırakılmasına neden olur, daha sonra bir segfault tarafından hızlıca takip edilir. Daha az rastlanan bir int ile int (int. 13 – eryksun
) En azından ben 'sys.maxint' (sistemimde '9223372036854775807' olana kadar) bile döngü yapmıyordum. Bugün bu hatayı yeniden üretemiyorum ve sanırım çalışmamdaki masaüstümü vurmaya çalışmam gerekmiyor. Yardım ettiğin için teşekkür ederim! – user1774143