如何在C#中释放IntPtr?

时间:2010-01-29 00:40:40

标签: c# interop pinvoke

如何释放ptrSentFromPinvokedDLL?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero;

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL);

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis");

// Free ptrSentFromPinvokedDLLhere

2 个答案:

答案 0 :(得分:10)

理想情况下,供应商要么担心这个问题,要么就会有供应商解除内存的功能。如果没有,您需要知道供应商如何分配内存。例如,如果供应商使用kernel32.dll中的LocalAlloc分配了内存,那么您可以使用Marshal.FreeHGlobal(IntPtr)释放内存。同样,如果使用COM内存分配器CoTaskMemAlloc,那么Marshal.FreeCoTaskMem(IntPtr)将用于释放内存。因此,请检查文档并相应地继续。

作为参考,这是关于内存分配模型的一个很好的MSDN article

答案 1 :(得分:1)

没有办法知道如何释放它,或者甚至需要在没有看到CallVendorDll内的代码的情况下释放它。 (或一些文件)