alocar atributo

O atributo ACF [allocate] permite personalizar a alocação e a desalocação de memória para um tipo definido no arquivo IDL.

typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;

Parâmetros

allocate-option-list

Especifica uma ou mais opções de alocação de memória. Selecione um dos single_node ou all_nodes, ou um de gratuito ou dont_free ou um de cada par. Quando você especificar mais de uma opção, separe as opções com vírgulas.

type-attribute-list

Especifica outros atributos opcionais do tipo ACF. Quando você especificar mais de um atributo de tipo, separe as opções com vírgulas.

type-name

Especifica um tipo definido no arquivo IDL.

Comentários

O atributo [allocate] tem as seguintes opções válidas.

Opção Descrição
all_nodes Faz uma chamada para alocar e liberar memória para todos os nós.
single_node Faz muitas chamadas individuais para alocar e liberar cada nó de memória.
gratuito Libera memória no retorno do stub do servidor.
dont_free Não libera memória no retorno do stub do servidor.

 

Por padrão, os stubs podem alocar armazenamento para dados referenciados por um ponteiro exclusivo ou completo chamando midl_user_allocate e midl_user_free individualmente para cada ponteiro.

Você pode otimizar a velocidade do aplicativo especificando a opção all_nodes. Essa opção direciona o stub para calcular o tamanho de toda a memória referenciada por meio do ponteiro do tipo especificado e para fazer uma única chamada para midl_user_allocate. O stub libera a memória fazendo uma chamada para midl_user_free.

A opção dont_free direciona o compilador MIDL para gerar um stub de servidor que não chama midl_user_free para o tipo especificado. A opção dont_free permite que as estruturas de ponteiro permaneçam acessíveis ao aplicativo de servidor depois que a chamada de procedimento remoto for concluída e retornada ao cliente.

O atributo [allocate] causará qualquer parâmetro [in, out] que seja um ponteiro para um tipo qualificado com a opção all_nodes para realocar a memória quando os dados não forem armazenados. É responsabilidade do aplicativo liberar a memória alocada anteriormente para esse parâmetro. Por exemplo:

typedef struct thistype 
{ 
    [string] char * PTHISTYPE;  
} * PTHISTYPE
HRESULT proc1 ( [in,out] PTHISTYPE * ppthistype);

O tipo de dados PTHISTYPE será realocado na direção [out] pelo stub antes de desmarcar. Portanto, o aplicativo deve liberar a memória alocada anteriormente para os dados desse parâmetro ou ocorrerá um vazamento de memória.

Exemplos

/* ACF file */ 
typedef [allocate(all_nodes, dont_free)] PTYPE1; 
typedef [allocate(all_nodes)] PTYPE2; 
typedef [allocate(dont_free)] PTYPE3;

Confira também

Arquivo de Configuração de Aplicativo (ACF)

Em

midl_user_allocate

midl_user_free

out

Typedef