Marshal.FreeHGlobal() 如何工作?

vrr*_*hod 1 .net c# c++ dll memory-management

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

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

Jim*_*hel 5

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

如果您对是否向 传递了正确的东西有一些疑问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.
}
Run Code Online (Sandbox Code Playgroud)

不过,我建议,如果您执行此操作,请调用LocalAlloc来分配内存而不是调用Marshal.AllocHGlobal,因为 .NET 的未来版本有可能(尽管不太可能)使用LocalAlloc分配非托管内存以外的其他内容。如果发生这种情况,那么您所依赖的代码LocalFree就会崩溃。

  • `Marshal.FreeHGlobal` 按合同调用 `LocalFree` https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.freehglobal(v=vs.110).aspx (4认同)