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