Marshal.FreeHGlobal应该被调用还是LocalFree?

时间:2014-11-30 10:46:13

标签: c# marshalling unmanagedresources

看到一段我不确定是否需要释放内存的代码。如果我在下面有这个块:

IntPtr buf = new IntPtr(logRecord.ToInt32() + logTotalCount * 
                  Marshal.SizeOf(typeof(SomeUnmanagedStruct)));

我是否需要致电Marshal.FreeHGlobal(buf)

根据我的有限理解(以及此SO),我认为我们不应该致电FreeHGlobal,因为我们没有打电话给Marshal.AllocHGlobal。但是,我也从这个SO中读到可能需要调用LocalFree

任何建议什么是释放这种记忆的正确方法(如果我需要做任何事情)?

更新:万一有人对IDISPOSABLE包装类感兴趣,有一篇很棒的文章here

1 个答案:

答案 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*