6

Python 2.7のドキュメントの2つのセクションでは、拡張モジュールで定義されたコンテナオブジェクトのサイクリックガベージコレクション(CGC)サポートの追加について説明しています。

Python / C APIリファレンスマニュアルには、次の2つのルールがあります。

  1. オブジェクトのメモリは、PyObject_GC_New()またはを使用して割り当てる必要がありますPyObject_GC_NewVar()
  2. 他のコンテナへの参照を含む可能性のあるすべてのフィールドが初期化されたら、を呼び出す必要がありますPyObject_GC_Track()

たとえば、Pythonインタープリターの拡張と埋め込みでは、フラグと塗りつぶしとスロットNoddyを追加するだけでCGCサポートを有効にできるようです。そして、上記の2つのルールはまったく実践されていません。Py_TPFLAGS_HAVE_GCtp_traversetp_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をサポートするコンテナオブジェクトのきちんとした例を教えてください。

4

2 に答える 2

3

私自身、C API についてアドバイスできるほど十分な経験はありませんが、Python コンテナーの実装自体には多くの例があります。

個人的には、最初にタプルの実装から始めます。これは不変であるためです: Objects/tupleobject.c。次に、変更可能なコンテナーに関する詳細な注意事項の実装に進みdictますlistset

setだけでなくPyObject_GC_New()PyObject_GC_NewVar()and through への呼び出しがあることに気が付かずにはいられません。PyObject_GC_Track()Py_TPFLAGS_HAVE_GC

于 2012-09-04T06:41:27.910 に答える