【发布时间】:2018-01-27 01:27:34
【问题描述】:
我有一个关于如何在 C 中的 PyList 上正确使用 Py_DECREF() 的问题。假设我有一个名为 build_list() 的函数,它接受一个字符串链表作为其输入参数,如果一切顺利,则返回一个 Python 列表, 或 NULL 如果有错误。
以下是简约示例:
struct strlist {
char *str;
size_t len;
struct strlist *next;
};
PyObject *build_list (struct strlist *inlist) {
struct strlist *node = NULL;
PyObject *tmp_obj = NULL;
int success;
PyObject *ret_obj = PyList_New(0);
if (ret_obj == NULL) {
return NULL;
}
node = inlist;
while (node != NULL) {
tmp_obj = PyString_FromStringAndSize(node->str, node->len);
if (tmp_obj == NULL) {
Py_DECREF(ret_obj);
return NULL;
}
else {
success = PyList_Append(ret_obj, tmp_obj);
Py_DECREF(tmp_obj);
if (success != 0) {
Py_DECREF(ret_obj);
return NULL;
}
}
node = node->next;
}
return ret_obj;
}
在这种情况下我是否正确使用了Py_DECREF()?
我的具体问题是:
如果在发生错误之前已将一些元素附加到列表中,我的代码将直接减少对列表的引用(在success != 0 内),而列表中的元素在技术上仍然具有 refcount 1。我是否应该减少每个元素的在我最终减少对列表的引用之前先引用?
谢谢。
【问题讨论】:
-
我猜你仍然可以说如果 you 没有 INCREF you 没有 DECREF 但是,对于那些说返回新引用的函数(主要是在创建 python 对象时),您拥有该对象,因此您必须 DECREF。