Поделиться через


Атрибут allocate

Атрибут ACF [allocate] позволяет настроить выделение памяти и освобождение для типа, определенного в IDL-файле.

typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;

Параметры

allocate-option-list

Задает один или несколько параметров выделения памяти. Выберите один из single_node или all_nodes либо один из бесплатных или dont_free либо по одному из каждой пары. При указании нескольких параметров разделяйте их запятыми.

type-attribute-list

Указывает другие необязательные атрибуты типа ACF. При указании нескольких атрибутов типа разделяйте параметры запятыми.

type-name

Указывает тип, определенный в IDL-файле.

Комментарии

Атрибут [allocate] имеет следующие допустимые параметры.

Параметр Описание
all_nodes Выполняет один вызов для выделения и освобождения памяти для всех узлов.
single_node Выполняет множество отдельных вызовов для выделения и освобождения каждого узла памяти.
free Освобождает память при возврате из заглушки сервера.
dont_free Не освобождает память при возврате из заглушки сервера.

 

По умолчанию заглушки могут выделять хранилище для данных, на которые ссылается уникальный или полный указатель, вызывая midl_user_allocate и midl_user_free по отдельности для каждого указателя.

Вы можете оптимизировать скорость приложения, указав параметр all_nodes. Этот параметр направляет заглушку, чтобы вычислить размер всей памяти, на который ссылается указатель указанного типа, и выполнить один вызов midl_user_allocate. Заглушка освобождает память, выполняя один вызов midl_user_free.

Параметр dont_free указывает компилятору MIDL создать серверную заглушку, которая не вызывает midl_user_free для указанного типа. Параметр dont_free позволяет структурам указателей оставаться доступными для серверного приложения после завершения удаленного вызова процедуры и возврата клиенту.

Атрибут [allocate] приведет к тому, что любой параметр [in, out], который является указателем на тип, соответствующий параметру all_nodes , перераспределит память при отмене распределения данных. Приложение отвечает за освобождение памяти, выделенной ранее для этого параметра. Пример:

typedef struct thistype 
{ 
    [string] char * PTHISTYPE;  
} * PTHISTYPE
HRESULT proc1 ( [in,out] PTHISTYPE * ppthistype);

Тип данных PTHISTYPE будет перераспределирован в направлении [out] на заглушку перед распаковыванием. Поэтому приложение должно освободить память, которая была ранее выделена для данных этого параметра, в противном случае произойдет утечка памяти.

Примеры

/* ACF file */ 
typedef [allocate(all_nodes, dont_free)] PTYPE1; 
typedef [allocate(all_nodes)] PTYPE2; 
typedef [allocate(dont_free)] PTYPE3;

См. также раздел

Файл конфигурации приложения (ACF)

В

midl_user_allocate

midl_user_free

Вне

Typedef