看到一段我不确定是否需要释放内存的代码。如果我在下面有这个块:
IntPtr buf = new IntPtr(logRecord.ToInt32() + logTotalCount *
Marshal.SizeOf(typeof(SomeUnmanagedStruct)));
我是否需要致电Marshal.FreeHGlobal(buf)
?
根据我的有限理解(以及此SO),我认为我们不应该致电FreeHGlobal
,因为我们没有打电话给Marshal.AllocHGlobal
。但是,我也从这个SO中读到可能需要调用LocalFree
?
任何建议什么是释放这种记忆的正确方法(如果我需要做任何事情)?
更新:万一有人对IDISPOSABLE包装类感兴趣,有一篇很棒的文章here。
答案 0 :(得分:1)
如果你不确定基类库实际上做了什么,你可以随时查看source code:
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*
。