How to free IntPtr in C#?

c#, interop, pinvoke

Solution

Ideally either the vendor worries about this or there would be a vendor function for deallocating the memory. If not, you need to know how the vendor allocated the memory. For example, if the vendor allocated the memory using `LocalAlloc` in `kernel32.dll` then you could free the memory using `Marshal.FreeHGlobal(IntPtr)`. Similarly, if the COM memory allocator `CoTaskMemAlloc` was used then `Marshal.FreeCoTaskMem(IntPtr)` would be used to free the memory. So check the documentation and proceed accordingly.

For reference, here's a nice MSDN article about memory allocation models.

Problem

How to free ptrSentFromPinvokedDLL? ``` IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero; int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL); resultFromVendor = DoMoreWorkFromVendorDLL( ptrSentFromPinvokedDLL, "workonthis"); // Free ptrSentFromPinvokedDLLhere ```

Original source