2010-01-29 14 views
7

Cómo liberar ptrSentFromPinvokedDLL?Cómo liberar IntPtr en C#?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero; 

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL); 

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis"); 

// Free ptrSentFromPinvokedDLLhere 
+4

Bueno, ¿cómo el proveedor * asignó * el puntero? Use el correspondiente separador. –

+0

Suponiendo que incluso necesite liberarlo. – Michael

Respuesta

9

Lo ideal es que las preocupaciones del vendedor sobre esto o lo que haya sea una función de proveedor para desasignar la memoria. De lo contrario, debe saber cómo el vendedor asignó la memoria. Por ejemplo, si el proveedor asignó la memoria usando LocalAlloc en kernel32.dll, entonces podría liberar la memoria usando Marshal.FreeHGlobal(IntPtr). Del mismo modo, si se utilizó el asignador de memoria COM CoTaskMemAlloc, se usaría Marshal.FreeCoTaskMem(IntPtr) para liberar la memoria. Por lo tanto, verifique la documentación y proceda en consecuencia.

Como referencia, aquí hay un buen MSDN article sobre modelos de asignación de memoria.

1

No hay forma de saber cómo liberarlo o si incluso necesita ser liberado sin ver el código dentro de CallVendorDll. (O alguna documentación)