3

如果它有所作为,我对有关 Python 3 的答案很感兴趣。

应该使用 , 调用的文档状态(此处此处)。PyBuffer_Release()PyArg_Parse*()s*y*

没有写过这样的东西Py_BuildValue()。这是一个疏忽,还是在Py_BuildValue()一个simple Py_DECREF()足够的情况下?

这是我的具体情况:

uint8_t buf = (uint8_t *)malloc(bufSize);
PyObject *pyBuf = Py_BuildValue("y#", (char *)buf, bufSize);
free(buf);

// do something with pyBuf

// maybe a PyBuffer_Release(get_underlying_buffer(pyBuf)) here?
Py_DECREF(pyBuf);
4

1 回答 1

2

我想不是:

  1. PyArg_Parse*andPy_BuildValue函数中,y#指的是字符串和长度,而不是缓冲区,因此没有要释放的底层缓冲区对象。

  2. 的文档Py_BuildValue说:

    当内存缓冲区作为参数传递以提供数据以构建对象时,对于 s 和 s# 格式,将复制所需的数据。调用者提供的缓冲区永远不会被 Py_BuildValue() 创建的对象引用。

    对所使用的缓冲区进行锁定的目的PyArg_Parse*是,您已经Python 中获得了对 C 的一些数据的引用,并且您希望在 C 中处理它,而不会被 Python 修改。在这种情况下,您已将一些数据从 C复制到 Python 中,因此无需保护原始数据不被修改。

于 2018-07-04T17:59:19.790 回答