Сущность технологии COM


Управление ресурсами и IUnknown - часть 2


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

  • А1. Когда ненулевой интерфейсный указатель записывается в локальную переменную.

  • А2. Когда вызываемый объект пишет ненулевой интерфейсный указатель в параметр [out] или [in, out] метода или функции.

  • A3. Когда вызываемый объект возвращает ненулевой интерфейсный указатель как физический результат (physical result) функции.
  • А4. Когда ненулевой интерфейсный указатель пишется в элемент данных объекта.

    Некоторые типичные ситуации, требующие вызова метода Release:

  • R1. Перед перезаписью ненулевой локальной переменной или элемента данных.

  • R2. Перед тем как покинуть область действия ненулевой локальной переменной.

  • R3. Когда вызываемый объект перезаписывает параметр [in,out] метода или функции, начальное значение которых отлично от нуля. Заметим, что параметры [out] предполагаются нулевыми при вводе и никогда не могут освобождаться вызываемым объектом.

  • R4. Перед перезаписью ненулевого элемента данных объекта.

  • R5. Перед завершением работы деструктора объекта, имеющего в качестве элемента данных ненулевой интерфейсный указатель.

    Типичная ситуация, к которой применимо правило о дополнительной информации, возникает при передаче указателей интерфейсов функциям как параметрам [in]:

  • S1. Когда при вызове функции или метода ненулевой интерфейсный указатель передается через [in]-параметр, вызов AddRef и Release, не требуются, так как время жизни временной переменной в стеке является строгим подмножеством времени жизни выражения, использованного для инициализации формального аргумента.

    Эти десять руководящих принципов охватывают ситуации, снова и снова возникающие при программировании в СОМ, и было бы неплохо их запомнить.

    Чтобы конкретизировать правила подсчета ссылок в СОМ, предположим, что имеется глобальная функция, которая возвращает объекту интерфейсный указатель:




    Начало  Назад  Вперед



    Книжный магазин