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;
-
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.
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.
/* ACF file */
typedef [allocate(all_nodes, dont_free)] PTYPE1;
typedef [allocate(all_nodes)] PTYPE2;
typedef [allocate(dont_free)] PTYPE3;