Marshal.DestroyStructure与.Net中的Marshal.FreeHGlobal

时间:2015-06-24 07:22:46

标签: .net marshalling dispose unmanaged finalizer

我有一个托管的.Net类,可以创建我需要确保正确清理的非托管资源。

我有一个顺序结构:

[StructLayout(LayoutKind.Sequential)]
struct FooBar { ... }

然后在构造函数中我有:

// Allocate the memory
var fb = new FooBar(...);
int length = Marshal.SizeOf(typeof(FooBar));
this.pointer = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(fb, this.pointer, false);

// Then I use this.pointer in extern calls

然后在我的~Finaliser / Dispose方法中,我使用Marshal.DestroyStructureMarshal.FreeHGlobal或两者(如果是这样的话,以什么顺序)来忍受我不要泄漏记忆?

奖金问题:

  • 我的IDisposable类是否需要继承CriticalFinalizerObject以确保始终调用清理?
  • 我可以使用Microsoft.Win32.SafeHandles类来包装危险的非托管内存吗?

1 个答案:

答案 0 :(得分:6)

两者。 Marshal.DestroyStructure将释放内容" FooBar的{​​{1}},而Marshal.FreeHGlobal将释放"容器"。显然,首先你释放内容,然后释放容器。首先Marshal.DestroyStructure然后Marshal.FreeHGlobal

我不认为CriticalFinalizerObject与编组struct有任何关联,struct无法继承任何内容,因此答案是否定的第一个问题。