Resumo das regras de alocação de memória
A tabela a seguir resume as regras-chave relativas à alocação de memória.
Elemento MIDL | Descrição |
---|---|
Ponteiros de nível superior [ ref] | Devem ser ponteiros não nulos. |
Valor retornado da função | A nova memória é sempre alocada para valores de retorno de ponteiro. |
[ exclusivo, ] ou [ ptr, out] ponteiro | Não permitido por MIDL. |
Não de nível superior [exclusivo , em, ] ou [ptr, dentro, fora] ponteiro que muda de nulo para não nulo | Os stubs do cliente alocam nova memória no cliente no retorno. |
Ponteiro não de nível superior [exclusivo, no, ] 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 de nível superior [ptr, no, ] 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 pela liberação e prevenção de vazamentos de memória nesse caso. |
[ref] ponteiros | A camada cliente-aplicativo geralmente aloca. |
Ponteiro não nulo [em, ] | 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 atributos de chave IDL e ACF no gerenciamento de memória.
Recurso MIDL | Problemas de cliente | Problemas de servidor |
---|---|---|
[ alocar(single_node)], [allocate(all_nodes)] | Determina se uma ou muitas chamadas são feitas para as funções de memória. | O mesmo que o cliente, exceto a memória privada, geralmente pode ser usada para alocar (single_node) [dentro] e [dentro,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 usada para alocações. |
[ no atributo ] | Aplicativo cliente responsável por alocar memória para dados. | Alocado no servidor por stubs. |
[ atributo] | Alocado no cliente por stubs. | [ponteiro ]-only deve ser [ref] ponteiro; alocado no servidor por stubs. |
[ ref] atributo | 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 [ exclusivo ].) | (Consulte [ exclusivo ].) |