allocare l'attributo
L'attributo ACF [allocate] consente di personalizzare l'allocazione della memoria e la deallocazione per un tipo definito nel file IDL.
typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;
-
allocate-option-list
-
Specifica una o più opzioni di allocazione della memoria. Selezionare una delle single_node o delle all_nodes oppure una delle dont_free gratuiteo una di ogni coppia. Quando si specificano più opzioni, separare le opzioni con le virgole.
-
type-attribute-list
-
Specifica altri attributi facoltativi di tipo ACF. Quando si specificano più attributi di tipo, separare le opzioni con le virgole.
-
type-name
-
Specifica un tipo definito nel file IDL.
L'attributo [allocate] include le opzioni valide seguenti.
Opzione | Descrizione |
---|---|
all_nodes | Effettua una chiamata per allocare e liberare memoria per tutti i nodi. |
single_node | Esegue molte singole chiamate per allocare e liberare ogni nodo di memoria. |
free | Libera memoria in caso di restituzione dallo stub del server. |
dont_free | Non libera memoria in caso di restituzione dallo stub del server. |
Per impostazione predefinita, gli stub possono allocare spazio di archiviazione per i dati a cui fa riferimento un puntatore univoco o completo chiamando midl_user_allocate e midl_user_free singolarmente per ogni puntatore.
È possibile ottimizzare la velocità dell'applicazione specificando l'opzione all_nodes. Questa opzione indirizza lo stub a calcolare le dimensioni di tutta la memoria a cui viene fatto riferimento tramite il puntatore del tipo specificato e per effettuare una singola chiamata a midl_user_allocate. Lo stub rilascia la memoria effettuando una chiamata a midl_user_free.
L'opzione dont_free indirizza il compilatore MIDL a generare uno stub del server che non chiama midl_user_free per il tipo specificato. L'opzione dont_free consente alle strutture del puntatore di rimanere accessibili all'applicazione server dopo che la chiamata alla procedura remota è stata completata e restituita al client.
L'attributo [allocate] causerà qualsiasi parametro [in, out] che sia un puntatore a un tipo qualificato con l'opzione all_nodes di riallocare la memoria quando i dati non sono stati separati. È responsabilità dell'applicazione liberare la memoria allocata in precedenza per questo parametro. Ad esempio:
typedef struct thistype
{
[string] char * PTHISTYPE;
} * PTHISTYPE
HRESULT proc1 ( [in,out] PTHISTYPE * ppthistype);
Il tipo di dati PTHISTYPE verrà riallocato nella direzione [out] dello stub prima dell'annullamento delmarshaling. Pertanto, l'applicazione deve liberare la memoria allocata in precedenza per i dati di questo parametro oppure si verificherà una perdita di memoria.
/* ACF file */
typedef [allocate(all_nodes, dont_free)] PTYPE1;
typedef [allocate(all_nodes)] PTYPE2;
typedef [allocate(dont_free)] PTYPE3;