内存接口
以下函数集,仿照 ANSI C 标准,并指定了请求零字节时的行为,可用于从Python堆分配和释放内存。
默认内存分配器 使用了 pymalloc 内存分配器.
警告
在使用这些函数时,必须持有 全局解释器锁(GIL) 。
在 3.6 版更改: 现在默认的分配器是 pymalloc 而非系统的 malloc()
。
void* PyMem_Malloc
(size_t n)
分配 n 个字节并返回一个指向分配的内存的 void*
类型指针,如果请求失败则返回 NULL
。
请求零字节可能返回一个独特的非 NULL
指针,就像调用了 PyMem_Malloc(1)
一样。但是内存不会以任何方式被初始化。
void* PyMem_Calloc
(size_t nelem, size_t elsize)
分配 nelem 个元素,每个元素的大小为 elsize 字节,并返回指向分配的内存的 void*
类型指针,如果请求失败则返回 NULL
。 内存会被初始化为零。
请求零字节可能返回一个独特的非 NULL
指针,就像调用了 PyMem_Calloc(1, 1)
一样。
3.5 新版功能.
void* PyMem_Realloc
(void *p, size_t n)
将 p 指向的内存块大小调整为 n 字节。以新旧内存块大小中的最小值为准,其中内容保持不变,
如果 p 是 NULL
,则相当于调用 PyMem_Malloc(n)
;如果 n 等于 0,则内存块大小会被调整,但不会被释放,返回非 NULL
指针。
除非 p 是 NULL
,否则它必须是之前调用 PyMem_Malloc()
、 PyMem_Realloc()
或 PyMem_Calloc()
所返回的。
如果请求失败,PyMem_Realloc()
返回 NULL
, p 仍然是指向先前内存区域的有效指针。
void PyMem_Free
(void *p)
释放 p 指向的内存块。 p 必须是之前调用 PyMem_Malloc()
、 PyMem_Realloc()
或 PyMem_Calloc()
所返回的指针。否则,或在 PyMem_Free(p)
之前已经调用过的情况下,未定义的行为会发生。
如果 p 是 NULL
, 那么什么操作也不会进行。
以下面向类型的宏为方便而提供。 注意 TYPE 可以指任何 C 类型。
TYPE* PyMem_New
(TYPE, size_t n)
与 PyMem_Malloc()
相同,但会分配 (n * sizeof(TYPE))
字节的内存。 返回一个转换为 TYPE*
的指针。 内存将不会以任何方式被初始化。
TYPE* PyMem_Resize
(void *p, TYPE, size_t n)
与 PyMem_Realloc()
相同,但内存块的大小被调整为 (n * sizeof(TYPE))
字节。 返回一个转换为 TYPE*
类型的指针。 返回时,p 将为指向新内存区域的指针,如果失败则返回 NULL
。
这是一个 C 预处理宏, p 总是被重新赋值。请保存 p 的原始值,以避免在处理错误时丢失内存。
void PyMem_Del
(void *p)
与 PyMem_Free()
相同
此外,我们还提供了以下宏集用于直接调用 Python 内存分配器,而不涉及上面列出的 C API 函数。但是请注意,使用它们并不能保证跨 Python 版本的二进制兼容性,因此在扩展模块被弃用。
PyMem_MALLOC(size)
PyMem_NEW(type, size)
PyMem_REALLOC(ptr, size)
PyMem_RESIZE(ptr, type, size)
PyMem_FREE(ptr)
PyMem_DEL(ptr)