Правила подсчета ссылок

Переводы статьи Переводы статьи
Код статьи: 104138 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В объектной модели компонентов времени жизни интерфейса осуществляется с помощью подсчета ссылок. Счетчик ссылок для интерфейса управляется через функции AddRef() и Release() член, наследуемый от интерфейса IUnknown. Член AddRef() увеличивает счетчик ссылок интерфейса и метода Release() уменьшает его. Когда счетчик ссылок интерфейса становится равным нулю, существует больше не все допустимые ссылки на этот интерфейс. Если счетчик ссылок на все интерфейсы объекта равно нулю, объект можно освободить, так как не все ссылки на объект.

Дополнительная информация

Правила подсчета ссылок

Ниже приведен список является копией правил (берутся из страницы 83 и 84 спецификации OLE 2.0), которого следует подсчета ссылок. Небольшие примеры были добавлены в данной статье, чтобы определить правила.

  1. Каждой новой копии указателя интерфейса должен быть AddRef бы (), и каждый уничтожение указатель интерфейса должен быть () и, кроме версии где последующие правила явно разрешают в противном случае.

    1. Параметры функции-исходящий: Вызывающий объект должен AddRef() фактический параметр, поскольку их (Release) будет вызываемым 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. Новые указатели, созданным из «тонкий воздух»: Функция, синтезирует указатель интерфейса, используя специальные знания внутренних вместо получения его из другого источника необходимо сделать начальной 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. Возвращает копию внутреннего хранимый указатель: После того как была возвращена указатель, вызываемый объект не имеет представление о том, как его время жизни относится к, внутри сохраненной копии указатель. Таким образом вызываемый объект должен быть 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. Специальными знаниями о связях о начале и в завершение срока жизни состояний из двух или более копий указатель интерфейса на части фрагмент кода может быть позволено AddRef()/Release() пары пропускаться.

    1. В параметры для функций: Копия указатель интерфейса, переданный в качестве фактического параметра функции имеет время существования, вложенные в, используемые для инициализации значения указателя. Таким образом фактический параметр не обязательно отдельно со счетчиком ссылок.
            void function (LPOLEOBJECT lpOleObject)
            {
      
            // Can use lpOleObject in this function
            // without doing AddRef() and Release().
      
            }
      								
    2. Out параметры из функций, включая возвращаемые значения: Чтобы установить выходной параметр, функция, правила 1 должен иметь копию стабильной указатель интерфейса. При выходе ответственность за освобождение указателя передается из вызываемого метода вызывающему объекту. Таким образом, выходного параметра должны быть нигде не учитываются.
            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, каждый из которых указателя в другую. Если известно, время жизни один компонент (A) содержат временем жизни других (B), а затем указатель из второй компонент обратно на первую (от B до A) требуется не ссылка инвентаризации. Часто избежать цикла, который в противном случае будет создана является важны для поддержания необходимого поведения высвобождения.

Свойства

Код статьи: 104138 - Последний отзыв: 12 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft OLE 2.0
Ключевые слова: 
kbprogramming kbmt KB104138 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:104138

Отправить отзыв

 

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