Marshal.DestroyStructure 与 .Net 中的 Marshal.FreeHGlobal
Marshal.DestroyStructure vs Marshal.FreeHGlobal in .Net
我有一个托管 .Net class,它创建了我需要确保正确清理的非托管资源。
我有一个顺序结构:
[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
class 是否需要继承 CriticalFinalizerObject
以确保始终调用清理?
- 有没有
Microsoft.Win32.SafeHandles
class 我可以在这里使用来包装危险的非托管内存?
两者都有。 Marshal.DestroyStructure
将释放 FooBar
的 "content",而 Marshal.FreeHGlobal
将释放 "container"。显然首先释放内容,然后释放容器。所以首先 Marshal.DestroyStructure
然后 Marshal.FreeHGlobal
.
我不认为 CriticalFinalizerObject
与编组 struct
有任何关系,并且 struct
不能继承任何东西,所以对第一个的回答是否定的问题。
我有一个托管 .Net class,它创建了我需要确保正确清理的非托管资源。
我有一个顺序结构:
[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
class 是否需要继承CriticalFinalizerObject
以确保始终调用清理? - 有没有
Microsoft.Win32.SafeHandles
class 我可以在这里使用来包装危险的非托管内存?
两者都有。 Marshal.DestroyStructure
将释放 FooBar
的 "content",而 Marshal.FreeHGlobal
将释放 "container"。显然首先释放内容,然后释放容器。所以首先 Marshal.DestroyStructure
然后 Marshal.FreeHGlobal
.
我不认为 CriticalFinalizerObject
与编组 struct
有任何关系,并且 struct
不能继承任何东西,所以对第一个的回答是否定的问题。