Movatterモバイル変換


[0]ホーム

URL:


Navigation

Memory Management

Overview

Memory management in Python involves a private heap containing all Pythonobjects and data structures. The management of this private heap is ensuredinternally by thePython memory manager. The Python memory manager hasdifferent components which deal with various dynamic storage management aspects,like sharing, segmentation, preallocation or caching.

At the lowest level, a raw memory allocator ensures that there is enough room inthe private heap for storing all Python-related data by interacting with thememory manager of the operating system. On top of the raw memory allocator,several object-specific allocators operate on the same heap and implementdistinct memory management policies adapted to the peculiarities of every objecttype. For example, integer objects are managed differently within the heap thanstrings, tuples or dictionaries because integers imply different storagerequirements and speed/space tradeoffs. The Python memory manager thus delegatessome of the work to the object-specific allocators, but ensures that the latteroperate within the bounds of the private heap.

It is important to understand that the management of the Python heap isperformed by the interpreter itself and that the user has no control over it,even if she regularly manipulates object pointers to memory blocks inside thatheap. The allocation of heap space for Python objects and other internalbuffers is performed on demand by the Python memory manager through the Python/CAPI functions listed in this document.

To avoid memory corruption, extension writers should never try to operate onPython objects with the functions exported by the C library:malloc(),calloc(),realloc() andfree(). This will result in mixedcalls between the C allocator and the Python memory manager with fatalconsequences, because they implement different algorithms and operate ondifferent heaps. However, one may safely allocate and release memory blockswith the C library allocator for individual purposes, as shown in the followingexample:

PyObject*res;char*buf=(char*)malloc(BUFSIZ);/* for I/O */if(buf==NULL)returnPyErr_NoMemory();...DosomeI/Ooperationinvolvingbuf...res=PyBytes_FromString(buf);free(buf);/* malloc'ed */returnres;

In this example, the memory request for the I/O buffer is handled by the Clibrary allocator. The Python memory manager is involved only in the allocationof the string object returned as a result.

In most situations, however, it is recommended to allocate memory from thePython heap specifically because the latter is under control of the Pythonmemory manager. For example, this is required when the interpreter is extendedwith new object types written in C. Another reason for using the Python heap isthe desire toinform the Python memory manager about the memory needs of theextension module. Even when the requested memory is used exclusively forinternal, highly-specific purposes, delegating all memory requests to the Pythonmemory manager causes the interpreter to have a more accurate image of itsmemory footprint as a whole. Consequently, under certain circumstances, thePython memory manager may or may not trigger appropriate actions, like garbagecollection, memory compaction or other preventive procedures. Note that by usingthe C library allocator as shown in the previous example, the allocated memoryfor the I/O buffer escapes completely the Python memory manager.

Memory Interface

The following function sets, modeled after the ANSI C standard, but specifyingbehavior when requesting zero bytes, are available for allocating and releasingmemory from the Python heap:

void*PyMem_Malloc(size_t n)

Allocatesn bytes and returns a pointer of typevoid* to theallocated memory, orNULL if the request fails. Requesting zero bytes returnsa distinct non-NULL pointer if possible, as ifPyMem_Malloc(1) hadbeen called instead. The memory will not have been initialized in any way.

void*PyMem_Realloc(void *p, size_t n)

Resizes the memory block pointed to byp ton bytes. The contents will beunchanged to the minimum of the old and the new sizes. Ifp isNULL, thecall is equivalent toPyMem_Malloc(n); else ifn is equal to zero,the memory block is resized but is not freed, and the returned pointer isnon-NULL. Unlessp isNULL, it must have been returned by a previous calltoPyMem_Malloc() orPyMem_Realloc(). If the request fails,PyMem_Realloc() returnsNULL andp remains a valid pointer to theprevious memory area.

voidPyMem_Free(void *p)

Frees the memory block pointed to byp, which must have been returned by aprevious call toPyMem_Malloc() orPyMem_Realloc(). Otherwise, orifPyMem_Free(p) has been called before, undefined behavior occurs. Ifp isNULL, no operation is performed.

The following type-oriented macros are provided for convenience. Note thatTYPE refers to any C type.

TYPE*PyMem_New(TYPE, size_t n)

Same asPyMem_Malloc(), but allocates(n*sizeof(TYPE)) bytes ofmemory. Returns a pointer cast toTYPE*. The memory will not havebeen initialized in any way.

TYPE*PyMem_Resize(void *p, TYPE, size_t n)

Same asPyMem_Realloc(), but the memory block is resized to(n*sizeof(TYPE)) bytes. Returns a pointer cast toTYPE*. On return,p will be a pointer to the new memory area, orNULL in the event offailure. This is a C preprocessor macro; p is always reassigned. Savethe original value of p to avoid losing memory when handling errors.

voidPyMem_Del(void *p)

Same asPyMem_Free().

In addition, the following macro sets are provided for calling the Python memoryallocator directly, without involving the C API functions listed above. However,note that their use does not preserve binary compatibility across Pythonversions and is therefore deprecated in extension modules.

PyMem_MALLOC(),PyMem_REALLOC(),PyMem_FREE().

PyMem_NEW(),PyMem_RESIZE(),PyMem_DEL().

Examples

Here is the example from sectionOverview, rewritten so that theI/O buffer is allocated from the Python heap by using the first function set:

PyObject*res;char*buf=(char*)PyMem_Malloc(BUFSIZ);/* for I/O */if(buf==NULL)returnPyErr_NoMemory();/* ...Do some I/O operation involving buf... */res=PyBytes_FromString(buf);PyMem_Free(buf);/* allocated with PyMem_Malloc */returnres;

The same code using the type-oriented function set:

PyObject*res;char*buf=PyMem_New(char,BUFSIZ);/* for I/O */if(buf==NULL)returnPyErr_NoMemory();/* ...Do some I/O operation involving buf... */res=PyBytes_FromString(buf);PyMem_Del(buf);/* allocated with PyMem_New */returnres;

Note that in the two examples above, the buffer is always manipulated viafunctions belonging to the same set. Indeed, it is required to use the samememory API family for a given memory block, so that the risk of mixing differentallocators is reduced to a minimum. The following code sequence contains twoerrors, one of which is labeled asfatal because it mixes two differentallocators operating on different heaps.

char*buf1=PyMem_New(char,BUFSIZ);char*buf2=(char*)malloc(BUFSIZ);char*buf3=(char*)PyMem_Malloc(BUFSIZ);...PyMem_Del(buf3);/* Wrong -- should be PyMem_Free() */free(buf2);/* Right -- allocated via malloc() */free(buf1);/* Fatal -- should be PyMem_Del()  */

In addition to the functions aimed at handling raw memory blocks from the Pythonheap, objects in Python are allocated and released withPyObject_New(),PyObject_NewVar() andPyObject_Del().

These will be explained in the next chapter on defining and implementing newobject types in C.

Table Of Contents

Previous topic

Initialization, Finalization, and Threads

Next topic

Object Implementation Support

This Page

Quick search

Enter search terms or a module, class or function name.

Navigation

©Copyright 1990-2017, Python Software Foundation.
The Python Software Foundation is a non-profit corporation.Please donate.
Last updated on Sep 19, 2017.Found a bug?
Created usingSphinx 1.2.

[8]ページ先頭

©2009-2025 Movatter.jp