参照カウント規則

文書翻訳 文書翻訳
文書番号: 104138
すべて展開する | すべて折りたたむ

目次

概要

コンポーネントのオブジェクト モデルでは、インタ フェースの有効期間が制御されます。参照をカウントするをします。インターフェイスの参照カウントです。AddRef() し Release() メンバー関数からの操作IUnknown から継承します。インタ フェースの AddRef() メンバーをインクリメントします。参照カウントをし、Release() メソッドにします。1 回、インターフェイスのリファレンス カウントが 0 になる、なくなった任意そのインターフェイスへの有効なポインター。すべての参照をカウントする場合は、オブジェクトのインターフェイスは 0、のでオブジェクトを解放することができますし、そのオブジェクトへのポインターはされなくがあります。

詳細

参照カウント規則

カウント (規則への参照のコピーを次に示しますページから 83、84 の OLE 2.0 仕様にする必要があります。後に。この資料で小規模なコードのサンプルが追加されましたルールを明確にします。

  1. すべての新しいコピーへのインターフェイス ポインターを () と、AddRef をする必要があり、すべて破棄へのインターフェイス ポインターをリリースを () の場合をする必要があります。場所後のルール明示的にそれ以外の場合ことを除く。

    1. 入出力パラメーターを関数にAddRef() 呼び出し元を必要があります、。実パラメーターは、呼び出される側でそのままなので () のリリースをしますout-value の上に格納されます。
            LPOLEOBJECT lpObject;
               .
               .  // Get pointer to IOleObject.
               .
            LPVIEWOBJECT lpView = lpObject;
      
            lpObject->AddRef()
      
            // GetViewObject is a theoretical function that takes a
            // pointer to anything derived from IUnknown, and then
            // returns a pointer to IViewObject in the same variable
            // passed as the parameter. The AddRef() above is needed so
            // that the original pointer to IOleObject is not freed.
      
            GetViewObject(lpView);
      								
    2. グローバル変数を取得します。: インターフェイスのローカル コピーポインターを既存のグローバル ポインターのコピーを取得変数と呼ばれるためにのカウントへの参照を個別にする必要があります。グローバルの中、ローカルのコピー機能が壊れる可能性があります。コピーはまだ生きています。
            void function()
            {
            // Get a pointer to IOleObject from a global variable.
            LPOLEOBJECT lpOleObject = glpObject;
      
            // This AddRef() is needed so that the interface
            // pointed to by the global variable, glpObject,
            // does not get released by a different part of
            // the applications code.
      
            lpOleObject->AddRef();
               .
               . // use lpOleObject;
               .
            lpOleObject->Release();
            }
      								
    3. 新しいポインターの「外に薄い空気の中」の合成: A 関数を内部では、インターフェイス ポインターを合成します。その他のソースから取得するのではなく、知識をする必要があります。初期の AddRef()、新しく合成されたポインターの操作を行います。インスタンスの作成のようなルーチンの重要な例を含めるIUnknown::QueryInterface を実装しているため、など。
            STDMETHDOIMP IUnknown::QueryInteface( REFIID iidInterface,
                                               LPVOID FAR *ppvObj)
            {
            *ppvObj = NULL;
            SCODE sc = E_NOINTERFACE;
      
            if (iidInterface == IUnknown)
                {
                *ppvObj = this;
      
                // This AddRef() is needed because a new pointer
                // was just created.
      
                AddRef();
               sc = S_OK;
                }
      
            return ResultFromScode(sc);
            }
      								
    4. 内部に格納されたポインターのコピーを取得します。: 1 回、返されたポインター、呼び出し先アイデア方法では、有効期間の内部に格納されたコピーに関連していますがポインターです。したがって、呼び出し先 AddRef() をポインターをコピーする前にする必要があります。取得します。
            // m_lpOleObject is a private member variable of a C++ class.
            // GetOleObject is a member function to return access to this
            // pointer.
      
            void GetOleObject (LPVOID FAR *ppObject)
            {
                *ppObject = m_lpOleObject;
      
                // This AddRef() is needed due to this rule.
      
                m_lpOleObject->AddRef();
             }
      								
  2. コードについての特別な知識、リレーションシップの開始し、2 つの存続期間の終わりまたは AddRef()/Release() へのインターフェイス ポインターの複数のコピーが可能除外するには、[組み合わせ] をクリックします。

    1. パラメーターを関数に: インターフェイス ポインターのコピー実関数にパラメーターが渡されます、ためにポインターの有効期間値を初期化します。したがって、実際のパラメーター必要はありません。参照を個別にカウントします。
            void function (LPOLEOBJECT lpOleObject)
            {
      
            // Can use lpOleObject in this function
            // without doing AddRef() and Release().
      
            }
      								
    2. アウト パラメーターなど、関数からの戻り値。 設定しますout パラメーターは関数自体がルール 1 必要があります、インターフェイス ポインターのコピーを安定しました。[終了]、ポインターを解放するための責任を転送してから、呼び出し先は呼び出し元にします。このため、out パラメーターはなくてください。参照カウントします。
            LPVIEWOBJECT lpView;
      
            HERROR hErr = lpOleObject->QueryInterface(IID_IViewObject,
                                                      (LPVOID FAR *)lpView);
      
            if (hErr = NOERROR)
                {
                // The QueryInterface succeeded. lpView does not have
                // to be AddRef()'d because it has already been done
                // by the QueryInterface method.
                }
      								
    3. ローカル変数関数の実装が明らかにしました。omniscient 知識のそれぞれのポインターの有効期間変数は、スタック フレーム上に割り当てられています。そのために使用できます。AddRef()/Release() の冗長ペアを省略するのには、このナレッジです。
            void function()
            {
            LPOLEOBJECT lpTempObject;
               .
               .
               .
            lpTempObject = lpObject;
               .
               .  // lpTempObject can be used
               .  // without reference counting as long as
               .  // it is known that the lifetime of lpObject
               .  // outside of this function call.
               .
            }
      								
    4. Backpointers: 一部のデータ構造の性質であります。A と B、それぞれへのポインターを持つ 2 つのコンポーネントが含まれている、他の。1 つのコンポーネント (A) の有効期間が含まれているがわかっている場合他の (B) し、2 つ目のポインターの有効期間コンポーネントに戻る (B a) から参照する必要はありませんカウントします。多くの場合、それ以外の場合になるサイクルを回避します。作成、適切な解放を保持することが重要です。動作します。

プロパティ

文書番号: 104138 - 最終更新日: 2011年6月30日 - リビジョン: 6.0
キーワード:?
kbprogramming kbmt KB104138 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:104138
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com