Implicit and explicit resource management¶
Pointer API¶
The Python C API has multiple APIs which implicit resource managements:
PyBytes_AsString()
PyUnicode_AsUTF8AndSize()
These functions return a pointer to data. The pointer becomes a dangling pointer once the object is deleted.
This API makes the assumption that the memory address of Python objects are fixed. Python implementations moving objects in memory have to pin these objects in memory to implement the API, and pinning memory is inefficient in this case.
The Py_buffer
API has a PyBuffer_Release()
function which can execute
code when a buffer is no longer needed:
- Call
Py_DECREF(obj)
- Free memory if the buffer was a memory copy
- Close files
- etc.
Array of objects¶
array = &PyTuple_GET_ITEM(tuple, 0)
is a common code pattern to access a
Python tuple as a C array of PyObject*
: array of PyObject**
type. It
makes the assumption that a tuple stores PyObject*
and PyObject**
becomes a dangling pointer once the tuple is destroyed.