Python 2.7のドキュメントの2つのセクションでは、拡張モジュールで定義されたコンテナオブジェクトのサイクリックガベージコレクション(CGC)サポートの追加について説明しています。
Python / C APIリファレンスマニュアルには、次の2つのルールがあります。
- オブジェクトのメモリは、
PyObject_GC_New()
またはを使用して割り当てる必要がありますPyObject_GC_NewVar()
。- 他のコンテナへの参照を含む可能性のあるすべてのフィールドが初期化されたら、を呼び出す必要があります
PyObject_GC_Track()
。
たとえば、Pythonインタープリターの拡張と埋め込みでは、フラグと塗りつぶしとスロットNoddy
を追加するだけでCGCサポートを有効にできるようです。そして、上記の2つのルールはまったく実践されていません。Py_TPFLAGS_HAVE_GC
tp_traverse
tp_clear
/と/Noddy
のルールに実際に従うように例を変更すると、驚くべきことに、次のようなアサーションエラーが発生しました。PyObject_GC_New()
PyObject_GC_Del()
PyObject_Track()
PyObject_GC_UnTrack()
Modules / gcmodule.c:348:visit_decref:アサーション "gc-> gc.gc_refs!=0"が失敗しました。refcountが小さすぎました
これは、CGCを実装するための正しい/安全な方法についての私の混乱につながります。誰かがアドバイスを与えることができますか、できれば、CGCをサポートするコンテナオブジェクトのきちんとした例を教えてください。