2010-01-29 13 views
7

Come liberare ptrSentFromPinvokedDLL?Come liberare IntPtr in C#?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero; 

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL); 

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis"); 

// Free ptrSentFromPinvokedDLLhere 
+4

Beh, come ha fatto il venditore * * allocare il puntatore? Utilizzare corrispondente deallocatore. –

+0

Presumendo ancora bisogno di liberarlo. – Michael

risposta

9

Idealmente sia le preoccupazioni del fornitore su questo o ci sarebbe una funzione di fornitore per deallocare la memoria. In caso contrario, è necessario sapere in che modo il produttore ha assegnato la memoria. Ad esempio, se il fornitore allocata la memoria utilizzando LocalAlloc in kernel32.dll allora si potrebbe liberare la memoria utilizzando Marshal.FreeHGlobal(IntPtr). Allo stesso modo, se è stato utilizzato l'allocatore di memoria COM CoTaskMemAlloc, utilizzare lo Marshal.FreeCoTaskMem(IntPtr) per liberare la memoria. Quindi controlla la documentazione e procedi di conseguenza.

Per riferimento, ecco una bella MSDN article sui modelli di allocazione della memoria.

1

Non c'è modo di sapere come liberarlo o se ha anche bisogno di essere liberato senza vedere il codice all'interno di CallVendorDll. (O qualche documentazione)