一旦我完成了它们,我应该用 FreeHGlobal 释放所有的 IntPtr 吗?

问题描述

我的项目中有很多 IntPtr,其中一些是从我的 dll 返回的,因此,我没有使用 Marshal.AllocHGlobal()

为它们分配内存
[DllImport(Dll,CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr CreatePart(IntPtr partId);

我应该如何释放从 dll 函数返回的这些 IntPtrs?

Marshal.FreeHGlobal()variable = IntPtr.Zero 或两者?

我在本网站和 Microsoft 文档上阅读了一些问题,他们说 Marshal.FreeHGlobal 应该用于使用 Marshal.AllocHGlobal 分配的任何内存。 如果我们没有为 IntPtr

分配内存怎么办

感谢您阅读我的问题。

解决方法

我应该如何释放从 dll 函数返回的这些 IntPtrs?

这取决于 CreatePart 的本机实现,但通常通过将返回的指针传递给另一个名为 DestroyPart 的本机方法或在您完成后的其他内容。

能否真正使用Marshal.FreeHGlobal来释放内存取决于分配内存的native方法的实现。释放内存的方式必须与分配内存的方式相匹配。

IntPtr 本身只是一个值类型:

Just what is an IntPtr exactly?