# オブジェクトをヒープ上にメモリ確保する

PyObject *_PyObject_New(PyTypeObject *type)
  戻り値: 新しい参照。

PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
  戻り値: 新しい参照。

PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
  戻り値: 借用参照。 次に属します: Stable ABI.

  新たにメモリ確保されたオブジェクト op に対し、型と初期状態での参照 (initial reference) を初期化します。初期化されたオブジェクトを返します。type からそのオブジェクトが循環参照ガベージ検出の機能を有する場合、検出機構が監視対象とするオブジェクトのセットに追加されます。オブジェクトの他のフィールドには影響を及ぼしません。

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
  戻り値: 借用参照。 次に属します: Stable ABI.

  `PyObject_Init()` の全ての処理を行い、可変サイズオブジェクトの場合には長さ情報も初期化します。

PyObject_New(TYPE, typeobj)

  C の構造体型 TYPE と Python の型オブジェクト typeobj ( `PyTypeObject*` ) を用いて Python オブジェクトの領域を新規確保します。Python のオブジェクトヘッダに定義されていないフィールドは初期化されません。呼び出し元がオブジェクトへの唯一の参照を持ちます（つまり、参照カウントは１になります）。メモリ割り当ての大きさは型オブジェクトの `tp_basicsize` フィールドによって定められます。

PyObject_NewVar(TYPE, typeobj, size)

  C の構造体型 TYPE と Python の型オブジェクト typeobj ( `PyTypeObject*` ) を用いて Python オブジェクトの領域を新規確保します。Python のオブジェクトヘッダに定義されていないフィールドは初期化されません。確保されたメモリには、 TYPE 構造体に加え、 typeobj の `tp_itemsize` フィールドによって定められた大きさのフィールドを size ( `Py_ssize_t` ) 個分格納できます。これはタプルなどの、生成時に大きさを決定できるオブジェクトを実装する際に便利です。同じメモリ割当にフィールドの配列も埋め込むことで、メモリ割当の回数を減らし、メモリ管理効率を上げることができます。

void PyObject_Del(void *op)

  `PyObject_New` または `PyObject_NewVar` によって、オブジェクトのために確保されたメモリを解放します。これは通常オブジェクトの型に指定されている `tp_dealloc` ハンドラから呼び出されます。これの呼び出し後のメモリは既に有効な Python オブジェクトではなくなっているため、オブジェクトのフィールドはアクセスされるべきではありません。

PyObject _Py_NoneStruct

  Python からは `None` に見えるオブジェクトです。この値へのアクセスは、このオブジェクトへのポインタを評価する `Py_None` マクロを使わなければなりません。

参考

`PyModule_Create()`

  拡張モジュールのアロケートと生成。