在Py_BuildValue(“ y#”,...)之后是否需要PyBuffer_Release?

时间:2018-07-04 11:25:48

标签: python python-c-api pybuffer

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

文档状态(herehere)指出,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);

1 个答案:

答案 0 :(得分:1)

我认为不:

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

  2. Py_BuildValue的文档说:

      

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

    PyArg_Parse*使用的缓冲区进行锁定的目的是,您获得了引用到Python到C的某些数据 out ,并且您想用C处理它,而没有任何机会被Python修改。在这种情况下,您已将C中的某些数据复制到到Python中,因此无需保护原始数据免于修改。