Требуется ли PyBuffer_Release после Py_BuildValue("y#", ...)?
Если это имеет значение, меня интересует ответ относительно 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);
1 ответ
Я думаю нет:
В обоих
PyArg_Parse*
а такжеPy_BuildValue
функции,y#
относится к строке и длине, а не к буферу, и, следовательно, нет базового объекта буфера для освобождения.Документация для
Py_BuildValue
говорит:Когда буферы памяти передаются в качестве параметров для предоставления данных для построения объектов, как для форматов s и s #, необходимые данные копируются. На буферы, предоставляемые вызывающей стороной, никогда не ссылаются объекты, созданные Py_BuildValue().
Цель удержания блокировки на буфере, используемом
PyArg_Parse*
в том, что у вас есть ссылка на некоторые данные из Python в C, и вы хотите обработать их в C без каких-либо шансов их изменения в Python. В этом случае вы скопировали некоторые данные из C в Python, поэтому нет необходимости защищать исходные данные от модификации.