参照カウントによるオブジェクトの有効期間の管理

従来のオブジェクト システムでは、オブジェクトのライフ サイクル、つまりオブジェクトの作成と削除に関する問題は、言語 (または言語ランタイム) によって暗黙的に、またはアプリケーション プログラマによって明示的に処理されます。

再利用されたコンポーネントで構成され、進化する分散的に構築されたシステムでは、クライアント、さらにはプログラマさえも、コンポーネントの寿命への対処方法を常に「知っている」ということはもはや真実ではありません。 適切なセキュリティ権限を持つクライアントの場合、単純なリクエストを通じてオブジェクトを作成することは依然として比較的簡単ですが、オブジェクトの削除はまったく別の問題です。 オブジェクトがいつ不要になり、削除する必要があるかは、必ずしも明確ではありません。 (Java などのガベージ コレクション プログラミング環境に精通している読者は同意しないかもしれません。ただし、Java オブジェクトはマシンやプロセスの境界にまたがることはありません。そのため、ガベージ コレクションは単一プロセス空間内に存在するオブジェクトに限定されます。Java では、単一のプログラミング言語の使用が強制されます。) 元のクライアントがオブジェクトの処理を終えた場合でも、他のクライアントがそのオブジェクトへの参照を保持している可能性があるため、単純にオブジェクトをシャットダウンすることはできません。

オブジェクトが不要になったことを確認する 1 つの方法は、基礎となる通信チャネルに完全に依存して、クロスプロセスまたはクロスチャネル オブジェクトへのすべての接続がなくなったときにシステムに通知することです。 ただし、この方法を使用するスキームは、いくつかの理由から受け入れられません。 1 つの問題は、クロスプロセス/クロスネットワーク プログラミング モデルと単一プロセス プログラミング モデルの間に大きな違いが必要になる可能性があることです。 クロスプロセス/クロスネットワーク プログラミング モデルでは、通信システムがオブジェクトの有効期間管理に必要なフックを提供しますが、シングルプロセス プログラミング モデルでは、オブジェクトは通信チャネルを介さずに直接接続されます。 もう 1 つの問題は、このスキームにより、インプロセスの場合にコンポーネントのパフォーマンスに干渉するシステム提供のソフトウェア層が生成される可能性があることです。 さらに、明示的な監視に基づくメカニズムは、数千または数百万のオブジェクトに拡張する傾向がありません。

COM は、この一連の問題に対するスケーラブルな分散アプローチを提供します。 クライアントは、オブジェクトを使用しているときと使用が終了したときをオブジェクトに通知し、オブジェクトが不要になるとオブジェクト自体を削除します。 このアプローチでは、すべてのオブジェクトがそれ自体への参照をカウントすることが義務付けられます。 Java などのプログラミング言語は、本質的にガベージ コレクションなどの独自の有効期間管理スキームを備えており、COM の参照カウントを使用して COM オブジェクトを内部的に実装および使用できるため、プログラマはその処理を回避できます。

アプリケーションが割り当てたメモリが使用されなくなったらそのメモリを解放する必要があるのと同様に、オブジェクトのクライアントは、そのオブジェクトが不要になったときにそのオブジェクトへの参照を解放する責任があります。 オブジェクト指向システムでは、クライアントはオブジェクトにそれ自体を解放する命令を与えることによってのみこれを行うことができます。

オブジェクトが使用されなくなったら、割り当てを解除することが重要です。 難しいのは、オブジェクトの割り当てをいつ解除するのが適切かを判断することです。 これは、自動変数 (スタック上に割り当てられた変数) を使用すると簡単です。自動変数は宣言されているブロックの外では使用できないため、ブロックの終わりに達するとコンパイラによって割り当てが解除されます。 動的に割り当てられる COM オブジェクトの場合、オブジェクトの使用が不要になる時期を決定するのは、オブジェクトのクライアントです。特に、複数のクライアントが同時に使用する可能性のあるローカル オブジェクトやリモート オブジェクトの場合はそうです。 オブジェクトは、すべてのクライアントがオブジェクトの使用を完了するまで待ってから、オブジェクト自体を解放する必要があります。 COM オブジェクトはインターフェイス ポインターを介して操作され、別のプロセスまたは他のマシン上のオブジェクトによって使用される可能性があるため、システムはオブジェクトのクライアントを追跡できません。

オブジェクトの割り当てを解除するのが適切な時期を判断する COM の方法は、手動参照カウントです。 各オブジェクトは、接続されているクライアントの数、つまり、任意のクライアント内のそのインターフェイスへのポインターがいくつ存在するかを追跡する参照カウントを維持します。

詳細については、次のトピックを参照してください。

IUnknown の使用と実装