Control
2 つの COM オブジェクトがあります (それらを と と呼びましょうJob
)。コントロールは CoCreatable で、Job オブジェクトは によって作成されControl.NewJob()
ます。
コントロールにはControl.Start(job)
、指定されたジョブを現在のジョブにするメソッドがあります。他のジョブが設定されていない限り、現在のジョブのままです。
クライアントの場合、これらの特定のコントロールに対して次の動作が妥当に見えます。
ジョブの 1 つが存在する限り、コントロールは存在します
(自明: ジョブは作成したコントロールへの強力な参照を保持します)。クライアントが Control またはその CurrentJob への参照を持っている限り、どちらも破棄されません (「自明」: CurrentJob は強力な参照です)。
クライアントは、参照を解放する前に CurrentJob を「クリア」する必要はありません。
さて、ここに古典的な循環参照があります。それを解放する条件は、両方のオブジェクトが外部参照を持たないことです。
このシナリオは、ATL の InternalRelease 実装をいじることで解決できますが、これは非常に見苦しく、孤立しています。
助言がありますか?既存のソリューション?