Атрибут 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;