【问题标题】:Should Marshal.FreeHGlobal be Called or LocalFree?应该调用 Marshal.FreeHGlobal 还是 LocalFree?
【发布时间】:2014-11-30 10:46:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 没有内存分配,所以没有什么可以释放的。我不清楚你认为你的代码行做什么。你能解释一下它的作用吗?
  • 啊哈好吧,我想可能是这样。我从其他人那里收到了这段代码,因此试图找出 buf 的用途,因为它被传递到第 3 方 C++ API 的参数中。

标签: c# marshalling unmanagedresources


【解决方案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*

【讨论】:

  • 完美答案 :) 清楚。非常感谢你。在 SO 让我(在 5 分钟内)之后,我会将其设置为解决方案 :)
猜你喜欢
  • 2015-09-07
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
相关资源
最近更新 更多