Sto solo cercando di capire come gestire i conteggi di riferimento quando si utilizza l'API Python C.API Python C, conteggio di riferimento elevato per nuovo oggetto
voglio chiamare una funzione Python in C++, in questo modo:
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;
codice
Il Python in pythonScript.py è molto semplice:
def run():
return 1
La documentazione di "PyObject_CallFunctionObjArgs" afferma che ottieni un nuovo riferimento come valore di ritorno. Quindi mi aspetterei "scriptResult" per avere un conteggio di riferimento del 1. Tuttavia l'output è:
scriptResult != null
print reference count: 72
Inoltre mi si aspetterebbe una perdita di memoria se vorrei farlo in un ciclo senza diminuire il conteggio dei riferimenti. Tuttavia questo sembra non accadere.
Qualcuno potrebbe aiutarmi a capire?
Cordiali saluti!
Una domanda successiva: grazie a @ecatmur e @KayZhu ora capisco perché non ci sono perdite di memoria. Tuttavia, se eseguo questo codice in un lungo loop, il mio sistema operativo completo si schiaccia comunque. Il numero di riferimenti a '1' sta aumentando, ogni iterazione, ma non vedo perché questo dovrebbe causare un errore di sistema. – user1774143
Sei in loop fino a che 'ob_refcnt' torna indietro a 0? Il conteggio di riferimento di 1 fluttua molto. Quando ci si riprende dopo lo 0, le normali operazioni potrebbero rendere "Py_DECREF" a 0 e far sì che 'int' 1 venga deallocato, seguito rapidamente da un segfault. Provalo con un 'int' internamente meno comune come 13. – eryksun
Almeno, non ero nemmeno in loop fino a 'sys.maxint' (che è '9223372036854775807' sul mio sistema). Oggi sembra che non riesca a riprodurre l'errore e credo che dovrei smettere di provare a scattare il mio desktop funzionante. Grazie per l'aiuto! – user1774143