2012-07-26 5 views
2

파이썬리스트를 생성 한 다음 데이터 아이템을 추가하는 코드가 있습니다. 데이터 항목 중 하나가 NULL로 밝혀지면 목록의 전체 (즉, 이전에 추가 된 항목)가 쓸데없는 것으로 간주되어 목록을 비우고 메모리를 확보하려고합니다. 가비지 컬렉터가 모든 메모리를 확보 할 수 있도록하려면 어떻게해야합니까?C 확장 코드에서 파이썬리스트 해제하기

현재 코드는 다음과 같습니다

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은 다음과 같습니다

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; 

하지만 우리는 같은 것을 할 싶습니다?

답변

2

그렇습니다. PyList_New()은 refcount가 1 인 개체를 생성하므로 예를 들어 돌아 오기 전에 적절한 예외를 설정해야합니다.

+0

답장을 보내 주셔서 감사합니다. Ignacio. variantToPython에서 예외를 설정했습니다. – user1554053