Resumo das regras de alocação de memória
A tabela a seguir resume as principais regras relacionadas à alocação de memória.
Elemento MIDL | Descrição |
---|---|
Ponteiros de nível superior [ ref] | Deve ser ponteiros não nulos. |
Valor retornado da função | A nova memória é sempre alocada para valores retornados por ponteiro. |
[ unique, out] ou [ ptr, out] pointer | Não permitido por MIDL. |
Ponteiro não superior [exclusivo, in, out] ou [ptr, in, out] que muda de nulo para não nulo | Os stubs do cliente alocam uma nova memória no cliente no retorno. |
Ponteiro não superior [exclusivo, in, out] que muda de não nulo para nulo | A memória é órfã no cliente; O aplicativo cliente é responsável por liberar memória e evitar vazamentos. |
Ponteiro não superior [ptr, in, out] que muda de não nulo para nulo | A memória ficará órfã no cliente se não for alias; O aplicativo cliente é responsável por liberar e evitar vazamentos de memória nesse caso. |
[ref] ponteiros | A camada cliente-aplicativo geralmente aloca. |
Ponteiro não nulo [in, out] | Os Stubs tentam gravar no armazenamento existente no cliente. Se [cadeia de caracteres] e o tamanho aumentarem além do tamanho alocado no cliente, isso causará uma falha de GP no retorno. |
A tabela a seguir resume os efeitos dos principais atributos de IDL e ACF no gerenciamento de memória.
Recurso MIDL | Problemas com o cliente | Problemas no servidor |
---|---|---|
[ allocate(single_node)], [allocate(all_nodes)] | Determina se uma ou muitas chamadas são feitas para as funções de memória. | Igual ao cliente, exceto que a memória privada geralmente pode ser usada para alocar (single_node) [in] e [in,out] dados. |
[allocate(free)] ou [allocate(dont_free)] | (Nenhum; afeta o servidor.) | Determina se a memória no servidor é liberada após cada chamada de procedimento remoto. |
atributos de matriz [ max_is] e [ size_is] | (Nenhum; afeta o servidor.) | Determina o tamanho da memória a ser alocada. |
[ byte_count] | O cliente deve alocar buffer; não alocado ou liberado por stubs de cliente. | O atributo de parâmetro ACF determina o tamanho do buffer alocado no servidor. |
[ enable_allocate] | Normalmente, nenhum. No entanto, o cliente pode estar usando um ambiente de gerenciamento de memória diferente. | O servidor usa um ambiente de gerenciamento de memória diferente. RpcSmAllocate deve ser usado para alocações. |
[ in]attribute | Aplicativo cliente responsável por alocar memória para dados. | Alocado no servidor por stubs. |
Atributo [ out] | Alocado no cliente por stubs. | [out]-only pointer deve ser [ref]pointer; alocado no servidor por stubs. |
Atributo [ ref] | A memória referenciada por ponteiro deve ser alocada pelo aplicativo cliente. | Ponteiros de referência de nível superior e de primeiro nível gerenciados por stubs. |
Atributo [ exclusivo] | Não nulo para nulo pode resultar em memória órfã; nulo para não nulo faz com que o stub do cliente chame midl_user_allocate. | (Afeta o cliente.) |
Atributo [ ptr] | (Consulte [ unique].) | (Consulte [ unique].) |