Regole di conteggio di riferimento

Traduzione articoli Traduzione articoli
Identificativo articolo: 104138 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Nel modello di oggetto componente, la durata di un'interfaccia è controllata tramite conteggio dei riferimenti. Il conteggio dei riferimenti per un'interfaccia viene gestito tramite può essere utilizzato in diversi modi le funzioni membro AddRef() e Release() ereditate da IUnknown all'interno di un. Il membro AddRef() incrementa il conteggio dei riferimenti un'interfaccia e il metodo Release() produce un decremento è. Una volta conteggio dei riferimenti di un'interfaccia a zero, non sono più tutti i puntatori validi per tale interfaccia. Se il conteggio dei riferimenti in tutte le interfacce di un oggetto è zero, quindi l'oggetto può essere liberato perché non ci sono tutti i puntatori all'oggetto.

Informazioni

Regole di conteggio di riferimento

Nell'elenco riportato di seguito è una copia del riferimento conteggio le regole (derivano dalle pagine 83 e 84 della specifica OLE 2.0) devono essere seguite. Esempi di codice piccole sono stati aggiunti in questo articolo per chiarire le regole.

  1. Ogni nuova copia di un puntatore a interfaccia deve essere AddRef d () e ogni eliminazione di un puntatore a interfaccia deve essere Release sarebbe ad eccezione di () in cui le regole successive consentono esplicitamente in caso contrario.

    1. -out parametri a funzioni : il chiamante deve AddRef() il parametro effettivo, perché sarà Release () sarebbe dal chiamato quando il out-value viene memorizzato su di essa.
            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. recupero di una variabile globale : la copia locale di un puntatore a interfaccia recuperato da una copia esistente del puntatore in una variabile globale deve essere in modo indipendente conteggiato perché denominate funzioni di riferimento potrebbe eliminare la copia di globale durante la copia locale è ancora attiva.
            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. nuovi puntatori sintetizzati di "sottile aria" : funzione che sintetizza un puntatore a interfaccia utilizzando speciali knowledge interno anziché richiedendolo un'altra origine deve eseguire un AddRef() iniziale sul puntatore appena sintetizzato. Importante tali routine esempi di routine di creazione di istanza, le implementazioni di IUnknown:: QueryInterface e così via.
            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. restituzione di una copia di un puntatore interne : quando il puntatore del mouse è stato restituito, il chiamato non ha alcuna idea che la sua durata relazione con quello della copia interne del puntatore del. Di conseguenza, il chiamato deve AddRef() il puntatore copia prima di restituire a esso.
            // 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. Speciale conoscenza parte di una porzione di codice le relazioni tra la parte iniziale e terminazioni della durata di due o più copie di un puntatore a interfaccia consente AddRef()/Release() coppie per essere omesso.

    1. parametri a funzioni : la copia di un puntatore di interfaccia che viene passato come parametro effettivo a una funzione ha una durata che è nidificata che del puntatore consente di inizializzare il valore. Di conseguenza, il parametro effettivo non deve separatamente conteggiata di riferimento.
            void function (LPOLEOBJECT lpOleObject)
            {
      
            // Can use lpOleObject in this function
            // without doing AddRef() and Release().
      
            }
      								
    2. parametri di uscita da funzioni, tra cui i valori restituiti : per impostare il parametro out, la funzione stessa regola 1 deve disporre di una stabile copia il puntatore di interfaccia. In uscita, la responsabilità di rilasciare il puntatore viene trasferita dal chiamato al chiamante. Di conseguenza, il parametro out necessario senza riferimenti conteggiati.
            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. le variabili locali : implementazione della funzione ha chiaramente omniscient conoscenza della durata di ogni le variabili di puntatore allocate sullo stack frame. Pertanto possibile utilizzare questa conoscenza per omettere coppie AddRef()/Release() ridondanti.
            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 : alcune strutture di dati sono la natura di contenente due componenti, A e B, ciascuno con un puntatore a altro. Se è noto che la durata di un componente (A) contiene la durata dell'altro (B), quindi il puntatore dal secondo componente nuovamente il primo (da B ad A) necessario non riferimento quantificabile. Spesso, evitando il ciclo che verrebbe creato in caso contrario è importante mantenere il comportamento di inizializzazione appropriato.

Proprietà

Identificativo articolo: 104138 - Ultima modifica: mercoledì 3 dicembre 2003 - Revisione: 3.1
Le informazioni in questo articolo si applicano a:
  • Microsoft OLE 2.0
  • Microsoft OLE 4.0 alle seguenti piattaforme
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • the operating system: Microsoft Windows 2000
Chiavi: 
kbmt kbprogramming KB104138 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 104138
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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