3. 参照回数
この章のマクロはPythonオブジェクトの参照回数を管理するために
用いられる。
- void Py_INCREF (PyObject *o)
-
オブジェクトoの参照回数を増やす。
オブジェクトはNULLであってはならない。もしあなたが
それがNULLでないかはっきりしなければ、Py_XINCREF()
を使いなさい。
- void Py_XINCREF (PyObject *o)
-
オブジェクトoの参照回数を増やす。オブジェクトは
NULLであってもよく、その場合マクロは何の効果もない。
- void Py_DECREF (PyObject *o)
-
オブジェクトoの参照回数を減らす。オブジェクトはNULLで
あってはならない。もしあなたがそれがNULLでないかはっきり
しなければ、Py_XINCREF()を使いなさい。
もし参照回数が零に達したら、オブジェクトの型の解放処理関数(これは
NULLであってはならない)が呼び出される。
警告: 解放処理関数によって任意のPythonコードが呼び出され得る
(例えば__del__()メソッドを持つクラスインスタンスが
解放されたとき)。そのようなコード中での例外が伝搬されない一方、
実行されたコードは全てのPythonの大域変数を自由に利用する。
これは、大域変数から到達可能などのオブジェクトは
Py_DECREF()が呼ばれる前に整合の取れた状態に
あるべきことを意味する。
例えば、リストからオブジェクトを削除するためのコードは、
一時変数に削除したオブジェクトへの参照をコピーして、
リストのデータ構造を更新して、そして一時変数に対して
Py_DECREF()を呼ぶべきである。
- void Py_XDECREF (PyObject *o)
-
オブジェクトoの参照回数を減らす。オブジェクトは
NULLであってもよく、その場合マクロは何の効果もない。
そうでなければその効果はPy_DECREF()と同じであり、
同じ警告があてはまる。
以下の関数・マクロはインタープリタの中核のなかで使うためだけである:
_Py_Dealloc(), _Py_ForgetReference(),
_Py_NewReference(),
そして大域変数_Py_RefTotalもである。