Skip to main content

Overview

Python provides specialized memory allocators for different purposes:
  1. Raw - System allocator wrappers (no GIL required)
  2. Mem - Python heap (GIL required)
  3. 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

Build docs developers (and LLMs) love