1

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

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

我需要打电话Marshal.FreeHGlobal(buf)吗?

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

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

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

4

1 回答 1

1

如果您不确定其中一个基类库实际上是做什么的,您可以随时查看源代码

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给 private void*

于 2014-11-30T10:54:53.020 回答