c# - Marshal.FreeHGlobal() 是如何工作的?

标签 c# .net c++ dll memory-management

我有一个基于 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/

相关文章:

c# - 正则表达式从一长串没有分区的代码中拆分不同的代码

C++ 在二维数组的每一行和每一列中查找最小值和最大值

c# - 从 Input.GetAxis() 读取时,transform.Translate 似乎加速和减速对象

c# - 是否可以在不将源移动到目标的情况下在 C# 中进行拖放?

c# - DataGridView 加载速度非常慢。如何优化 DataGridView 中的行添加?

c# - 调用其他命令的 PSCmdlet 由于处理时间长而卡住?

.net - 在运行时如何解释和执行 XAML?

c++ - 哈希函数无法正常工作

c++ - 管理 2 个 Internet 连接?

c# - 如何使用 ASP.NET 从代码后面添加额外的 css 类?