Marshal.FreeHGlobal() 如何工作?

2023-12-11

我有一个基于 C# 的 UI,它使用基于 C++ 的 DLL。我的要求是将一大块内存从 C# 传递到 DLL。 DLL 将写入此内存缓冲区并将其传回 C#。我已经使用 IntPtr 和全局内存函数来执行此操作。一切正常。

问题是,如何验证 Marshal.FreeHGlobal() 是否已清理内存?我正在使用大块内存,通常以 MB 为单位。所以我想确保内存立即被清理。


如果您将有效句柄传递给Marshal.FreeHGlobal, it will被释放。但由于该方法不返回值,因此您无法确定它是否已被清理。

如果您对是否传递了正确的内容有疑问FreeHGlobal,那么我建议您的代码可能没有应有的干净。但如果您确实想确定,那么您可以致电LocalFreeWindows 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,因为 .NET 的未来版本有可能(尽管可能不太可能)使用除LocalAlloc分配非托管内存。如果发生这种情况,那么您的代码取决于LocalFree会坏的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Marshal.FreeHGlobal() 如何工作? 的相关文章

随机推荐