Condividi tramite


Gestione della memoria con il marshalling di interoperabilità

Nel gestore di marshalling di interoperabilità viene sempre eseguito il tentativo di liberare la memoria allocata dal codice non gestito. Questo comportamento, conforme alle regole di gestione della memoria di COM, differisce tuttavia dalla regole su cui è basato il codice C++ nativo.

Se si prevede il comportamento C++ nativo, con cui la memoria non viene liberata, quando si utilizza platform invoke, con cui la memoria viene automaticamente liberata per i puntatori, può quindi verificarsi confusione. Mediante la chiamata al metodo non gestito riportato di seguito da una DLL di C++, ad esempio, la memoria non viene liberata automaticamente.

Firma non gestita

BSTR MethodOne (BSTR b) {
     return b;
}

Se tuttavia si definisce il metodo come un prototipo di platform invoke, si sostituisce ciascun tipo BSTR con un tipo String e si effettua la chiamata a MethodOne, in Common Language Runtime il tentativo di liberare b verrà effettuato due volte. È possibile modificare il comportamento di marshalling utilizzando tipi IntPtr anziché tipi String.

Nel runtime, per liberare la memoria viene sempre utilizzato il metodo CoTaskMemFree. Se la memoria utilizzata non è stata allocata con il metodo CoTaskMemAlloc, è necessario utilizzare un tipo IntPtr e liberare la memoria manualmente mediante il metodo appropriato. Analogamente, è possibile evitare la liberazione automatica della memoria nei casi in cui è opportuno che la memoria non venga mai liberata, ad esempio quando si utilizza la funzione GetCommandLine da Kernel32.dll, che restituisce un puntatore alla memoria del kernel. Per informazioni dettagliate su come liberare manualmente la memoria, vedere Esempio di buffer.

Vedere anche

Concetti

attributi direzionali

tipi copiabili e non copiabili

copia e blocco

Altre risorse

comportamento predefinito del marshaling