我们有一些代码可以创建一个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;

那么list对象上的DECREF是否足以确保GC释放所有内容?

最佳答案

是的,因为PyList_New()创建refcount为1的对象不过,在返回之前应该设置适当的异常。

关于python - 从C扩展代码中释放python列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11666283/

10-11 15:47