Overview
Python provides specialized memory allocators for different purposes:
- Raw - System allocator wrappers (no GIL required)
- Mem - Python heap (GIL required)
- Object - Python objects only
Memory Domains
Raw Memory
void* PyMem_RawMalloc(size_t size)
void* PyMem_RawRealloc(void *ptr, size_t new_size)
void PyMem_RawFree(void *ptr)
For buffers, no GIL required.
Python Memory
void* PyMem_Malloc(size_t size)
void* PyMem_Realloc(void *ptr, size_t new_size)
void PyMem_Free(void *ptr)
For Python-managed memory.
Object Memory
void* PyObject_Malloc(size_t size)
void PyObject_Free(void *ptr)
Free-threaded builds: Only use PyObject_* for Python objects, not buffers!
Memory Errors
PyObject* PyErr_NoMemory(void)
Set MemoryError exception.
Example:
void *buf = PyMem_Malloc(size);
if (buf == NULL)
return PyErr_NoMemory();
Best Practices
Never mix allocators:// WRONG:
void *p = PyMem_Malloc(100);
free(p); // Wrong deallocator!
// RIGHT:
void *p = PyMem_Malloc(100);
PyMem_Free(p);
See Also