Spec-Zone.ru › Python 3.14

Выделение объектов в куче

PyObject *_PyObject_New(PyTypeObject *type)
Возвращаемое значение: новая ссылка.
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
Возвращаемое значение: новая ссылка.
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
Возвращаемое значение: заимствованная ссылка. Часть стабильного ABI.

Инициализирует вновь выделенный объект op, задавая его тип и начальную ссылку. Возвращает инициализированный объект. Остальные поля объекта не инициализируются. Несмотря на название, эта функция не связана с методом __init__() объекта (слот tp_init). В частности, эта функция не вызывает метод __init__() объекта.

В целом эту функцию следует считать низкоуровневой процедурой. По возможности используйте tp_alloc. Для реализации tp_alloc вашего типа предпочтительно использовать PyType_GenericAlloc() или PyObject_New().

Примечание

Эта функция инициализирует только ту часть памяти объекта, которая соответствует исходной структуре PyObject. Остальная память не обнуляется.

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
Возвращаемое значение: заимствованная ссылка. Часть стабильного ABI.

Выполняет всё то же, что и PyObject_Init(), а также инициализирует информацию о длине объекта переменного размера.

Примечание

Эта функция инициализирует только часть памяти объекта. Остальная память не обнуляется.

PyObject_New(TYPE, typeobj)

Выделяет новый объект Python, используя тип структуры C TYPE и объект типа Python typeobj (PyTypeObject*), вызывая PyObject_Malloc() для выделения памяти и инициализируя его так же, как PyObject_Init(). Вызывающий код будет единственным владельцем ссылки на объект (то есть счётчик ссылок будет равен единице).

Не вызывайте эту функцию напрямую для выделения памяти объекту; вместо этого используйте слот tp_alloc типа.

При заполнении слота tp_alloc типа предпочтительнее использовать PyType_GenericAlloc(), а не пользовательскую функцию, которая просто вызывает этот макрос.

Этот макрос не вызывает tp_alloc, tp_new (__new__()) или tp_init (__init__()).

Его нельзя использовать для объектов, у которых в tp_flags установлен флаг Py_TPFLAGS_HAVE_GC; вместо этого используйте PyObject_GC_New.

Память, выделенную этим макросом, необходимо освободить с помощью PyObject_Free() (обычно это делается через слот tp_free объекта).

Примечание

Нет гарантии, что возвращаемая память была полностью обнулена перед инициализацией.

Примечание

Этот макрос не создаёт полностью инициализированный объект заданного типа; он лишь выделяет память и подготавливает её к дальнейшей инициализации с помощью tp_init. Чтобы создать полностью инициализированный объект, вместо этого вызовите typeobj. Например:

PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);

См. также

  • PyObject_Free()
  • PyObject_GC_New
  • PyType_GenericAlloc()
  • tp_alloc
PyObject_NewVar(TYPE, typeobj, size)

Аналогичен PyObject_New, за исключением следующего:

  • Выделяет достаточно памяти для структуры TYPE и size (Py_ssize_t) полей размером, указанным в поле tp_itemsize объекта typeobj.
  • Память инициализируется так же, как в PyObject_InitVar().

Это полезно при реализации таких объектов, как кортежи, размер которых можно определить во время создания. Размещение массива полей в том же блоке памяти сокращает количество выделений памяти и повышает эффективность управления памятью.

Не вызывайте эту функцию напрямую для выделения памяти объекту; вместо этого используйте слот tp_alloc типа.

При заполнении слота tp_alloc типа предпочтительнее использовать PyType_GenericAlloc(), а не пользовательскую функцию, которая просто вызывает этот макрос.

Его нельзя использовать для объектов, у которых в tp_flags установлен флаг Py_TPFLAGS_HAVE_GC; вместо этого используйте PyObject_GC_NewVar.

Память, выделенную этой функцией, необходимо освободить с помощью PyObject_Free() (обычно это делается через слот tp_free объекта).

Примечание

Нет гарантии, что возвращаемая память была полностью обнулена перед инициализацией.

Примечание

Этот макрос не создаёт полностью инициализированный объект заданного типа; он лишь выделяет память и подготавливает её к дальнейшей инициализации с помощью tp_init. Чтобы создать полностью инициализированный объект, вместо этого вызовите typeobj. Например:

PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);

См. также

  • PyObject_Free()
  • PyObject_GC_NewVar
  • PyType_GenericAlloc()
  • tp_alloc
PyObject _Py_NoneStruct

Объект, представленный в Python как None. К нему следует обращаться только с помощью макроса Py_None, который возвращает указатель на этот объект.

См. также

Объекты модулей

Выделение памяти и создание модулей расширения.

Устаревшие псевдонимы

Считается устаревшим начиная с версии 3.10.

Это псевдонимы существующих функций и макросов. Они сохранены исключительно для обратной совместимости.

Устаревший псевдоним

Функция

PyObject_NEW(type, typeobj)

PyObject_New

PyObject_NEW_VAR(type, typeobj, n)

PyObject_NewVar

PyObject_INIT(op, typeobj)

PyObject_Init()

PyObject_INIT_VAR(op, typeobj, n)

PyObject_InitVar()

PyObject_MALLOC(n)

PyObject_Malloc()

PyObject_REALLOC(p, n)

PyObject_Realloc()

PyObject_FREE(p)

PyObject_Free()

PyObject_DEL(p)

PyObject_Free()

PyObject_Del(p)

PyObject_Free()

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/c-api/allocation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API