拡張モジュールで定義されたコンテナオブジェクトの循環ガベージコレクション(CGC)のサポートについてPython 2.7のドキュメントの2つのセクションで説明されています。拡張モジュールの正しい循環ガベージコレクション
Python/C API Reference Manualは、オブジェクトのメモリがPyObject_GC_New()
又はPyObject_GC_NewVar()
を使用して割り当てられなければならない、すなわち、
- 、2つのルールを与えます。
- 他のコンテナへの参照を含むフィールドがすべて初期化されたら、
PyObject_GC_Track()
を呼び出す必要があります。 Extending and Embedding the Python Interpreterで
一方、Noddy
例えば、Py_TPFLAGS_HAVE_GC
フラグを追加し、tp_traverse
とtp_clear
スロットを充填するCGCのサポートを可能にするのに十分であろうと思われます。上記の2つのルールはまったく練習されていません。私は実際にPyObject_GC_New()
/PyObject_GC_Del()
とPyObject_Track()
/PyObject_GC_UnTrack()
のルールに従うようにNoddy
例を修正すると、それは驚くほど言っアサーションエラーが発生した
、
モジュール/ gcmodule.c:348:visit_decref:アサーション「GC →gc.gc_refs!= 0 "が失敗しました。 refcountが小さすぎました
これは、CGCを実装するための正しい/安全な方法についての私の混乱につながります。誰でも助言を与えることができますか、好ましくは、ニート CGCをサポートするコンテナオブジェクトの例ですか?
返信いただきありがとうございます。 'PyObject_GC_New()' APIのいくつかのバージョンが、AssertionErrorの原因であるサブタイプを正しく処理できない可能性を調査しています。 – liuyu