【发布时间】:2019-10-07 05:01:57
【问题描述】:
我是 Python C-API 的新手,我浏览了一些源代码来挑选其中的一部分。
这是我在包含扩展模块的包的 C 源代码中找到的函数的最小版本:
#define PY_SSIZE_T_CLEAN
#include <Python.h>
static PyObject *
modulename_myfunc(PyObject *self, PyObject *args) {
// Call PyArg_ParseTuple, etc ...
// Dummy values; in the real function they are calculated
int is_found = 1;
Py_ssize_t n_bytes_found = 1024;
PyObject *result;
result = Py_BuildValue("(Oi)",
is_found ? Py_True : Py_False, // Py_INCREF?
n_bytes_found);
return result;
}
这是否会因为未能在 Py_True 或 Py_False 上使用 Py_INCREF 而引入少量内存泄漏? C-API docs for Boolean object 似乎非常明确地表明总是需要增加/ decref Py_True 和 Py_False。
如果确实需要引入Py_INCREF,假设Py_RETURN_TRUE/Py_RETURN_FALSE 由于返回元组而实际上并不适用,那么如何最恰当地使用它?
【问题讨论】:
标签: python c python-3.x python-c-api