vrr*_*hod 1 .net c# 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.
}
Run Code Online (Sandbox Code Playgroud)
不过,我建议,如果您执行此操作,请调用LocalAlloc
来分配内存而不是调用Marshal.AllocHGlobal
,因为 .NET 的未来版本有可能(尽管不太可能)使用LocalAlloc
分配非托管内存以外的其他内容。如果发生这种情况,那么您所依赖的代码LocalFree
就会崩溃。
归档时间: |
|
查看次数: |
7119 次 |
最近记录: |