如何在C#中释放IntPtr?

11

如何释放ptrSentFromPinvokedDLL指针?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero;

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL);

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis");

// Free ptrSentFromPinvokedDLLhere

4
那么,供应商如何 分配 指针?使用相应的解除分配器。 - Eric Lippert
假设你需要释放它。 - Michael
2个回答

10
理想情况下,厂商会关注这个问题或者提供一个释放内存的函数。如果没有,您需要了解厂商如何分配内存。例如,如果厂商使用 kernel32.dll 中的 LocalAlloc 分配内存,则可以使用 Marshal.FreeHGlobal(IntPtr) 释放内存。同样地,如果使用了 COM 内存分配器 CoTaskMemAlloc,则使用 Marshal.FreeCoTaskMem(IntPtr) 来释放内存。因此,请查阅文档并相应地进行操作。
供参考,这里有一篇关于内存分配模型的MSDN文章

1

如果没有查看 CallVendorDll 中的代码(或者一些文档),就无法知道如何释放它,或者是否需要释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接