これらは通常、参照を作成およびリリースするための API を提供します。
たとえば、Java の Native Interface はグローバル参照を提供しており、C プログラムが Java オブジェクトをNewGlobalRef
およびDeleteGlobalRef
NewGlobalRef
obj 引数によって参照されるオブジェクトへの新しいグローバル参照を作成します。obj 引数は、グローバル参照またはローカル参照の場合があります。グローバル参照は、呼び出して明示的に破棄する必要がありますDeleteGlobalRef()
また、Java が次の目的で制御を C に渡した場合にのみ存続するローカル参照も提供します。
ローカル参照は、ネイティブ メソッド呼び出しの間有効です。ネイティブ メソッドが返された後、それらは自動的に解放されます。
JVM 埋め込み APIは、C プログラムがオブジェクトの処理が完了したと判断するまで、オブジェクトをメモリに固定できる同様のメカニズムを提供します。
Python の C 拡張 APIは、JNI と同様の API を提供します。
借用参照は、 を呼び出して所有参照に変更できますPy_INCREF()
。
Py_DECREF()
参照の所有者は、参照が不要になったときに呼び出す責任があります。
Python の名前は、Python が参照カウントを使用するという事実を反映しています* が、API は基本的に非参照カウント ガベージ コレクタに基づく JNI のものと同じです。インタプリタによって管理されるメモリ領域を固定する関数が 1 つあります。もう 1 つは、以前に固定された領域を解放してインタープリターに戻します。
* - python は、真の ref-counting アプローチではありません。同じページから「Python は従来の参照カウントの実装を使用していますが、参照サイクルを検出するために機能するサイクル検出器も提供しています。」