Требуется ли PyBuffer_Release после Py_BuildValue ("y #", ...)? - PullRequest
0 голосов
/ 04 июля 2018

Если это имеет значение, меня интересует ответ относительно 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 Ответ

0 голосов
/ 04 июля 2018

Я думаю, что нет:

  1. В обеих функциях PyArg_Parse* и Py_BuildValue y# относится к строке и длине, а не к буферу, и, следовательно, нет подлежащего освобождению объекта буфера.

  2. Документация для Py_BuildValue гласит:

    Когда буферы памяти передаются в качестве параметров для предоставления данных для построения объектов, как для форматов s и s #, необходимые данные копируются. На буферы, предоставленные вызывающей стороной, никогда не ссылаются объекты, созданные Py_BuildValue ().

    Цель удержания блокировки в буфере, используемом PyArg_Parse*, заключается в том, что вы получили ссылку на некоторые данные из Python для C, и вы хотите обработать это в C без каких-либо шансов его изменения Python. В этом случае вы скопировали некоторые данные из C в Python, поэтому нет необходимости защищать исходные данные от модификации.

...