我有一个基于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,因为将来的.NET可能(尽管可能不太可能)会使用LocalAlloc之外的其他方式来分配非托管内存。如果发生这种情况,则依赖LocalFree的代码将中断。

关于c# - Marshal.FreeHGlobal()如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4949084/

10-13 06:19