Правила управления памятью
Время существования указателей на интерфейсы всегда управляется методами AddRef и Release в каждом интерфейсе COM. Дополнительные сведения см. в разделе "Правила для управления счетчиками ссылок".
Для всех остальных параметров важно придерживаться определенных правил управления памятью. Следующие правила применяются ко всем параметрам методов интерфейса, включая возвращаемое значение, которое не передается по значению:
- Параметры должны быть выделены и освобождены вызывающим объектом.
- Параметры вне должны быть выделены одним из вызываемых; они освобождаются вызывающим оператором с помощью стандартного средства выделения памяти задачи COM. Дополнительные сведения см . в параметре OLE Memory Allocator .
- В/вне параметры изначально выделяются вызывающим объектом, а затем освобождаются и перераспределяются вызываемым, при необходимости. Как и для параметров out, вызывающий отвечает за освобождение окончательного возвращаемого значения. Необходимо использовать стандартный инструмент выделения памяти COM.
В последних двух случаях, когда один фрагмент кода выделяет память и другой фрагмент кода освобождает его, используя com-распределитель гарантирует, что два фрагмента кода используют одинаковые методы выделения.
Еще одной областью, требующей особого внимания, является лечение параметров вне и выхода в условиях сбоя. Если функция возвращает код сбоя, вызывающий объект обычно не имеет способа очистки параметров вне или выхода. Это приводит к следующим дополнительным правилам:
- В случае ошибки параметры всегда должны быть надежно заданы в значение, которое будет очищаться без каких-либо действий вызывающей стороны.
- Все параметры указателя выхода должны быть явно заданы как NULL. Обычно они передаются в параметр указателя на указатель, но также могут передаваться как члены структуры, которую вызывающий объект выделяет и вызываемые заливки кода. Самый простой способ убедиться, что это (в части) для задания этих значений значение NULL для записи функции. Это правило важно, так как оно способствует более надежному взаимодействию приложений.
- При условии ошибки все параметры вне сети должны быть оставлены в одиночку вызываемым кодом (таким образом, оставшимся в значении, в котором они были инициализированы вызывающим оператором) или явно заданы, как в случае возврата ошибки параметров out.
Помните, что эти соглашения об управлении памятью для приложений COM применяются только в общедоступных интерфейсах и API; Нет никаких требований, что выделение памяти строго внутренне для COM-приложения должно выполняться с помощью этих механизмов.
COM использует удаленные вызовы процедур (RPC) для обмена данными между клиентами и серверами. Дополнительные сведения об управлении памятью в заглушках сервера RPC см. в разделе "Управление памятью с заглушки сервера".