Compartilhar via


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].)