2012-07-26 20 views
2

我們有一些代碼會創建一個python列表,然後將數據項添加到它。我們擔心的是,如果其中一個數據項變爲NULL,那麼我們認爲整個列表(即任何以前添加的項目)都毫無價值,我們想要釋放列表和它的內存。我需要做些什麼來確保垃圾收集器釋放所有內存?從C擴展代碼中釋放python列表

當前的代碼是:

PyObject* retval = PyList_New(0); 

QList<QVariant> varList = value.toList(); 
foreach(QVariant var, varList) 
{ 
    // variantToPython(var) returns either NULL 
    // or a valid object whose reference count is 1 
    PyObject *pyVar = variantToPython(var); 
    if (pyVar) 
    { 
     PyList_Append(retval, pyVar); 
     Py_DECREF(pyVar); 
    } 
} 

return retval; 

,但我們想要做的是這樣的:

PyObject* retval = PyList_New(0); 

QList<QVariant> varList = value.toList(); 
foreach(QVariant var, varList) 
{ 
    // variantToPython(var) returns either NULL 
    // or a valid object whose reference count is 1 
    PyObject *pyVar = variantToPython(var); 
    if (pyVar) 
    { 
     PyList_Append(retval, pyVar); 
     Py_DECREF(pyVar); 
    } 
    else 
    { 
     Py_DECREF(retval); 
     retval = 0; 
     break; 
    } 
} 

return retval; 

所以是列表對象足以保證GC釋放一切的DECREF?

回答

2

是的,因爲PyList_New()創建了一個refcount爲1的對象。您應該在返回前設置適當的異常。

+0

感謝您的回答伊格納西奧。我們在variantToPython中設置了一個異常。 – user1554053 2012-07-26 09:37:46