【问题标题】:Freeing a python list from C extension code从 C 扩展代码中释放 python 列表
【发布时间】:2012-07-26 09:26:59
【问题描述】:

我们有一些代码可以创建一个 python 列表,然后将数据项附加到它上面。我们担心的是,如果其中一个数据项结果为 NULL,那么我们认为整个列表(即任何先前添加的项)都毫无价值,我们想释放列表和它的内存。我需要做什么来确保垃圾收集器释放所有内存?

目前的代码是:

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;

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

【问题讨论】:

    标签: python c list free python-extensions


    【解决方案1】:

    是的,因为PyList_New() 创建了一个引用计数为 1 的对象。不过,您应该在返回之前设置一个适当的异常。

    【讨论】:

    • 感谢您的回答,伊格纳西奥。我们在 variantToPython 中设置了一个例外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2022-06-14
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多