我有这样的代码:
static PyObject* py_write(PyObject *self, PyObject* args){
PyObject *tx_list;
PyObject *item = 0;
uint8_t tx_len = 0;
/* Parse arguments */
if(!PyArg_ParseTuple(args, "O!", &PyList_Type, &tx_list)){
return NULL;
}
/* Get length of list */
tx_len = PyList_Size(tx_list);
/* Allocate memory for output buffer */
uint8_t *tx_buffer = (uint8_t *)malloc(tx_len * sizeof(uint8_t));
memset(tx_buffer, 0, sizeof(uint8_t));
/* Populate output buffer */
int i;
for(i = 0; i < tx_len; i++){
item = PyList_GetItem(tx_list, i);
tx_buffer[i] = (uint8_t)PyInt_AsLong(item);
}
/* Send data */
if(spi_write(fd, tx_buffer, tx_len) < 0){
return PyErr_SetFromErrno(PyExc_IOError);
}
/* Do cleanup */
free(tx_buffer);
Py_DECREF(item);
Py_DECREF(tx_list);
Py_RETURN_NONE;
}当我调用此方法一次时,没有任何问题。但是在大约2000年的时候,我得到了分段错误。我猜我的引用计数有问题。有没有人可以帮我或者告诉我一些调试的方法?
发布于 2014-08-18 22:08:11
PyList_GetItem返回一个借用的引用,你不需要Py_DECREF项。此外,当调用Python C-Api调用时,如果出现异常,则返回NULL。检查来自PyList_GetItem的NULL。
https://stackoverflow.com/questions/25363338
复制相似问题