我有一个基于 C# 的 UI,它使用基于 C++ 的 DLL。我的要求是将一大块内存从 C# 传递到 DLL。 DLL 将写入此内存缓冲区并将其传递回 C#。我已经使用 IntPtr 和全局内存函数来执行此操作。一切正常。
问题是,如何验证 Marshal.FreeHGlobal() 是否已清理内存?我正在使用大块内存,通常以 MB 为单位。所以我想确保立即清理内存。
最佳答案
如果您将有效句柄传递给 Marshal.FreeHGlobal
,它将被释放。但由于该方法不返回值,因此您无法确定它是否已被清理。
如果您对是否将正确的东西传递给 FreeHGlobal
有疑问,那么我建议您的代码可能没有达到应有的整洁度。但是如果你真的想确定,那么你可以调用 LocalFree
Windows API 函数,将你传递给 FreeHGlobal
的句柄传递给它:
[DllImport("kernel32", SetLastError=true)]
static extern IntPtr LocalFree(IntPtr mem);
// Now, to free a block of memory allocated with Marshal.AllocHGlobal
IntPtr rslt = LocalFree(memPtr);
if (rslt == IntPtr.Zero)
{
// success!
}
else
{
int err = Marshal.GetLastWin32Error();
// do something with the error.
}
但是,我建议,如果您这样做,您可以调用 LocalAlloc
来分配内存,而不是调用 Marshal.AllocHGlobal
,因为这是可能的(尽管可能不太可能) future 版本的 .NET 可以使用 LocalAlloc
以外的东西来分配非托管内存。如果发生这种情况,那么依赖于 LocalFree
的代码就会中断。
关于c# - Marshal.FreeHGlobal() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4949084/