应该叫Marshal.FreeHGlobal还是LocalFree
本文关键字:还是 LocalFree FreeHGlobal Marshal | 更新日期: 2023-09-27 18:32:42
看到了一段代码,我不确定是否需要释放内存。如果我在下面有这个块:
IntPtr buf = new IntPtr(logRecord.ToInt32() + logTotalCount *
Marshal.SizeOf(typeof(SomeUnmanagedStruct)));
我需要打电话Marshal.FreeHGlobal(buf)
吗?
根据我有限的理解(以及这个SO),我认为我们不应该打电话给FreeHGlobal
因为我们没有打电话给Marshal.AllocHGlobal
。但是,我也从这个SO中读到LocalFree
可能需要被称为?
任何建议释放此内存的正确方法是什么(如果我需要做任何事情)?
更新:以防万一有人对一次性包装器类感兴趣,这里有一篇很棒的文章。
如果您不确定其中一个基类库的实际作用,您可以随时查看源代码:
public struct IntPtr : ISerializable
{
[SecurityCritical]
unsafe private void* m_value; // The compiler treats void* closest to uint
// hence explicit casts are required to preserve int
// behavior
public unsafe IntPtr(int value)
{
#if WIN32
m_value = (void *)value;
#else
m_value = (void *)(long)value;
#endif
}
}
如您所见,这实际上并不是分配任何非托管内存,而只是将int
分配给专用void*
。