应该叫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可能需要被称为?

任何建议释放此内存的正确方法是什么(如果我需要做任何事情)?

更新:以防万一有人对一次性包装器类感兴趣,这里有一篇很棒的文章。

应该叫Marshal.FreeHGlobal还是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*