如何在 Python C API 中的内存视图上调用释放

How to call release on a memoryview in Python C API

我有一个现有的 PyMemoryViewObject,我想 "release" 使 memoryview 对象无效。

我可以通过 PyObject_CallMethod API:

调用 release 函数
if (PyMemoryView_Check(obj)) {
  PyObject_CallMethod(obj, "release", NULL);
}

这很好用,但我想使用更直接的方法。

我试过这个:

if (PyMemoryView_Check(obj)) {
  PyBuffer_Release(PyMemoryView_GET_BUFFER(obj));
}

但是,这不起作用,我仍然能够从 Python 中的缓冲区 read/write。事实上,PyBuffer_Release 的文档说:

/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */

没有 C API 要求。你必须通过一个方法调用。 (您可能希望从 C 调用的许多方法都是这种情况。)

不要试图在内存视图的底层 Py_buffer 上调用 PyBuffer_Release。内存视图负责执行此操作,并跟踪它是否已完成。如果您尝试自己释放缓冲区,内存视图将处于不一致状态,仍然认为它拥有一个有效的缓冲区,事情就会崩溃。