You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python C-API中释放部分初始化的列表?

PyList初始化失败时的内存清理方案

当使用PyList_New初始化列表,且在循环添加元素过程中出现错误(比如_function_may_set_exc_and_return_null()返回NULL),必须正确清理已分配的资源,避免内存泄漏。

错误处理逻辑

由于Python列表对象在引用计数降至0时,会自动遍历内部所有元素并调用Py_DECREF释放资源,因此无需手动逐个清理已添加的元素,直接销毁列表即可完成全部内存回收:

PyObject* my_list = PyList_New(count);
if (!my_list) {
    return PyErr_NoMemory();
}
for (int i = 0; i < count; i++) {
    PyObject* element = _function_may_set_exc_and_return_null();
    if (!element) {
        // 销毁列表,列表会自动释放所有已添加的元素
        Py_DECREF(my_list);
        return NULL;
    }
    PyList_SET_ITEM(my_list, i, element);
}
return my_list;

关键说明

  • PyList_SET_ITEM会直接将元素的所有权转移给列表,列表持有元素的引用。当列表被Py_DECREF销毁时,Python内部会自动处理所有元素的引用释放。
  • 返回NULL前无需额外设置异常,因为_function_may_set_exc_and_return_null()已经触发了Python异常,上层调用者可通过PyErr_Occurred()检测并处理。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:22:32