Gestione della memoria

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 la chiamata al sistema operativo, 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 si definisce il metodo come un prototipo per la chiamata al sistema operativo, si sostituisce ciascun tipo BSTR con un tipo String e si esegue 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

Comportamento di marshalling predefinito | Attributi direzionali | Tipi copiabili e non copiabili | Copia e blocco