如何在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
相关产品推荐
相关产品推荐

