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


Сводка правил выделения памяти

В следующей таблице приведены основные правила, касающиеся выделения памяти.

Элемент MIDL Описание
Указатели верхнего уровня [ ссылка] Должны быть указателями, не имеющими значения NULL.
Возвращаемое значение функции Для возвращаемых значений указателя всегда выделяется новая память.
[ уникальный, out] или [ ptr, out] указатель Не разрешено MIDL.
Указатель , не относящегося к верхнему уровню [unique, in, out] или [ptr, in, out], который меняется с NULL на non-NULL Заглушки клиента выделяют новую память для клиента при возврате.
Указатель , не относящегося к верхнему уровню [unique, in, out], который меняется с ненулевого на null Память на клиенте потеряна; клиентское приложение отвечает за освобождение памяти и предотвращение утечек.
Указатель , не относящегося к верхнему уровню [ptr, in, out], который меняется с ненулевого на null Если нет псевдонима, память на клиенте будет потеряна; В этом случае клиентское приложение отвечает за освобождение и предотвращение утечек памяти.
[ссылка] указатели Уровень клиент-приложение обычно выделяет.
Указатель, отличный от null [in, out] Заглушки пытаются выполнить запись в существующее хранилище на клиенте. Если [строка] и размер увеличиваются сверх размера, выделенного на клиенте, это приведет к ошибке GP при возврате.

 

В следующей таблице приведены общие сведения о влиянии ключевых атрибутов IDL и ACF на управление памятью.

Функция MIDL Проблемы с клиентом проблемами на сервере;
[ allocate(single_node)], [allocate(all_nodes)] Определяет, выполняется ли один или несколько вызовов функций памяти. То же, что и клиент, за исключением частной памяти, часто можно использовать для выделения (single_node) данных [in] и [in,out].
[allocate(free)] or [allocate(dont_free)] (Нет; влияет на сервер.) Определяет, освобождается ли память на сервере после каждого удаленного вызова процедуры.
атрибуты массива [ max_is] и [ size_is] (Нет; влияет на сервер.) Определяет размер выделенной памяти.
[ byte_count] Клиент должен выделить буфер; не выделяется или не освобождается клиентскими заглушками. Атрибут параметра ACF определяет размер буфера, выделенного на сервере.
[ enable_allocate] Как правило, нет. Однако клиент может использовать другую среду управления памятью. Сервер использует другую среду управления памятью. Для выделений следует использовать RpcSmAllocate.
[ in]attribute Клиентское приложение, ответственное за выделение памяти для данных. Выделяется на сервере заглушками.
Атрибут [ out] Выделяется на клиенте заглушками. [out]- только указатель должен быть указателем [ref]; выделяется на сервере заглушками.
Атрибут [ ref] Память, на которую ссылается указатель, должна быть выделена клиентским приложением. Указатели верхнего и первого уровня, управляемые заглушками.
Атрибут [ unique] От null до null может привести к потере памяти; значение null на значение, отличное от NULL, приводит к вызову заглушки клиента midl_user_allocate. (Влияет на клиент.)
Атрибут [ ptr] (См. [ уникальный].) (См. [ уникальный].)