Сводка правил выделения памяти
В следующей таблице приведены основные правила, касающиеся выделения памяти.
Элемент 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] | (См. [ уникальный].) | (См. [ уникальный].) |