2014-06-27 5 views
9

मैं अजगर, https://docs.python.org/2/extending/newtypes.html, में 'नए प्रकार' को परिभाषित करने के लिए ट्यूटोरियल के माध्यम से जा रहा था और मैं कोड के इस टुकड़े में Py_DECREF का उपयोग करने का उद्देश्य समझ में नहीं आया।Py_DECREF और PY_INCREF का उद्देश्य क्या है?

static PyObject * 
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 
{ 
    Noddy *self; 

    self = (Noddy *)type->tp_alloc(type, 0); 
    if (self != NULL) { 
     self->first = PyString_FromString(""); 
     if (self->first == NULL) 
      { 
      Py_DECREF(self); 
      return NULL; 
      } 

     self->last = PyString_FromString(""); 
     if (self->last == NULL) 
      { 
      Py_DECREF(self); 
      return NULL; 
      } 

     self->number = 0; 
    } 

    return (PyObject *)self; 
} 

संदर्भ गणना की मेरी समझ कमजोर है और किसी भी मदद की सराहना की जाएगी।

+0

मुझे नहीं पता कि यह कोड भ्रमित कैसे हो सकता है। आपने अभी एक ऑब्जेक्ट ('self') बनाया है, और' Py_DECREF' को स्ट्रिंग बनाने के दौरान कुछ ऐसा करने के मामले में इसे रद्द करने के लिए कहा जाता है ... इसके बारे में क्या स्पष्ट नहीं है? – Bakuriu

उत्तर

4

CPython कचरा कलेक्टर का उपयोग करता है 'संदर्भ गिनती', यानी यह एक वस्तु के लिए संदर्भ की एक सूची रखता। यदि किसी ऑब्जेक्ट की संदर्भ संख्या शून्य पर आती है, तो इसका तात्पर्य है कि कचरा कलेक्टर के लिए उस ऑब्जेक्ट के लिए स्थान को डिलीकेट करने के लिए सुरक्षित है।

इसलिए, जब हम PyObjects परिभाषित यह जरूरी है कि हम स्पष्ट रूप से Py_DECREF है, जो वृद्धि फोन Py_INCREF और और क्रमश: एक वस्तु के संदर्भ में गिना जाता है कम हो।

7

इस मामले में, Py_DECREF बस स्मृति tp-> alloc साथ आवंटित मुक्त होगा।

tp-> alloc रेफरी गिनती 1. Py_DECREF कम हो जाती है 1 0 से रेफरी गिनती बनाया; क्योंकि यह रेफ गिनती 0 है, यह मेमोरी को मुक्त करने के लिए उचित कार्यों को कॉल करता है (इस मामले में Noddy_dealloc।)

यदि कोई अजगर सी एपीआई फ़ंक्शन न्यूल देता है, तो कुछ गलत हो गया है; आम तौर पर एक अपवाद सेट किया जाता है (एक वैश्विक चर में सहेजा जाता है)।

फोन करने वाले रिटर्न फिर से नल हैं, तो अपवाद श्रृंखलित है, इसलिए 'वापसी शून्य'।

संबंधित मुद्दे