我有一个托管的.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.DestroyStructure
或Marshal.FreeHGlobal
或两者(如果是这样的话,以什么顺序)来忍受我不要泄漏记忆?
奖金问题:
IDisposable
类是否需要继承CriticalFinalizerObject
以确保始终调用清理?Microsoft.Win32.SafeHandles
类来包装危险的非托管内存吗?答案 0 :(得分:6)
两者。 Marshal.DestroyStructure
将释放内容" FooBar
的{{1}},而Marshal.FreeHGlobal
将释放"容器"。显然,首先你释放内容,然后释放容器。首先Marshal.DestroyStructure
然后Marshal.FreeHGlobal
。
我不认为CriticalFinalizerObject
与编组struct
有任何关联,struct
无法继承任何内容,因此答案是否定的第一个问题。