मेरे पास एक सी-एक्सटेंशन शामिल है जिसमें मैं विकसित कर रहा हूं। सी में, मेरे पास A
नामक युगल की एक सरणी है और AnotherIntVariable
नामक एक इंट वैरिएबल है जिसे मैं पाइथन पास करना चाहता हूं। खैर, मेरी सी विस्तार मॉड्यूल में मैं निम्न कार्य करें:पायथन में सी-एक्सटेंशन - वापसी Py_BuildValue() मेमोरी लीक समस्या
int i;
PyObject *lst = PyList_New(len_A);
PyObject *num;
if(!lst)
return NULL;
for(i=0;i<len_A;i++){
num=PyFloat_FromDouble(A[i]);
if(!num){
Py_DECREF(lst);
return NuLL;
}
PyList_SET_ITEM(lst,i,num);
}
free(A);
return Py_BuildValue("Oi",lst,AnotherIntVariable)
तो अजगर में मैं इस सूची को और इस तरह पूर्णांक प्राप्त:
Pyt_A,Pyt_int=MyCModule.MyCFunction(...)
कहाँ Pyt_A और Pyt_int सूची और पूर्णांक हैं मैं अपने सी-एक्सटेंशन "MyCModule
" से मिलता हूं, जो कि पहले वर्णित "MyCFunction
" फ़ंक्शन से मिलता है।
कि, पायथन में, मैं इस Pyt_A
सरणी का उपयोग करें (ताकि कारण है कि मैं एक साधारण return
बयान के बजाय Py_BuildValue
उपयोग करते हैं, आदेश कचरा कलेक्टर से एक पल के लिए इस चर को बचाने के लिए एक INCREF करना है), लेकिन है तो मुझे उस आवंटित स्मृति को मुक्त करने के लिए इसे किसी भी तरह से खराब करने की आवश्यकता है। समस्या यह है कि मैं कई बार MyCFunction
फ़ंक्शन का उपयोग करता हूं, और यह एक स्मृति रिसाव उत्पन्न करता है क्योंकि मुझे पता नहीं है कि इससे छुटकारा पाने के लिए मुझे अजगर में प्राप्त सरणी को कैसे हटाया जाए।
मैं सिर्फ Py_BuildValue("Oi",lst,AnotherIntVariable)
के बजाय कोड के सी हिस्से में एक return lst
करके सरणी लौटने की कोशिश की, लेकिन एक विभाजन दोष में है कि केवल परिणाम जब मैं अजगर में इसका इस्तेमाल करने की कोशिश (शायद इसलिए कि कचरा कलेक्टर किया उसके काम) ...
... मुझे यहां क्या याद आ रही है? कोई भी मेरी मदद कर सकता हैं?
पाइथन DECREF में डेल Pyt_A नहीं है और इसे हटा दें? – highBandWidth
मैंने कोशिश की लेकिन यह काम नहीं कर रहा है। मुझे अभी भी यह स्मृति रिसाव मिल रहा है जिसके बारे में मैं बात कर रहा हूं। –
इसके अलावा, आपके पास Py_BuildValue ("ओई", lst, anotherIntVariable) से पहले वापसी है? – highBandWidth