Python C API를 사용할 때 참조 카운트를 처리하는 방법을 이해하려고합니다.Python C API, 새로운 객체에 대한 참조 횟수가 높습니다.
나는 다음과 같이 C++에서 파이썬 함수를 호출 할 :
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에서
파이썬 코드는 매우 간단합니다 :
이def run():
return 1
"PyObject_CallFunctionObjArgs"의 설명서를 말한다 당신은 반환 값으로 새로운 참조를 얻습니다. 내가 참조 카운트를 감소시키지 않고 루프에서이 작업을 수행 할 경우
scriptResult != null
print reference count: 72
이 또한 내가 메모리 누수가 기대 : 출력은 그러나 그래서 1의 참조 카운트를 갖고 "scriptResult"을 기대. 그러나 이것은 일어나지 않는 것 같습니다.
누군가 나를 이해하도록 도와 줄 수 있습니까?
친절에 감사드립니다!
후속 질문 : @ecatmur 및 @KayZhu 덕분에 이제는 메모리 누수가없는 이유를 알았습니다. 그럼에도 불구하고이 코드를 긴 루프에서 실행하면 완전한 OS가 어쨌든 으스러지게됩니다. '1'에 대한 레퍼런스 카운트가 매 반복마다 증가하고 있지만 이것이 왜 시스템 실패를 일으키는 지 알지 못합니다. – user1774143
'ob_refcnt'가 0 번 순환 할 때까지 루핑을하고 있습니까? 참조 횟수가 1로 많이 변동합니다. 지난 0을 감싸는 경우, 정상적인 연산은'Py_DECREF'를 0으로 할 수 있고'int' 1은 할당 해제되고, segfault에 의해 빠르게 따라옵니다. 덜 일반적인 intern 같은 1312와 같은 int를 시도해보십시오. – eryksun
적어도 sys.maxint (내 시스템에서는 '9223372036854775807')까지 반복하지 않았습니다. 오늘 나는 오류를 재현 할 수없는 것 같아 내 작업 바탕 화면을 쏘려고하지 말아야한다고 생각합니다. 당신의 도움을 주셔서 감사합니다! – user1774143