gpt4 book ai didi

.net - .Net 中的 Marshal.DestroyStructure 与 Marshal.FreeHGlobal

转载 作者:行者123 更新时间:2023-12-04 00:07:41 31 4
gpt4 key购买 nike

我有一个托管的 .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 类来包装危险的非托管内存吗?

最佳答案

两者兼而有之。 Marshal.DestroyStructure 将释放 FooBar 的“内容”,而 Marshal.FreeHGlobal 将释放“容器”。显然,首先释放内容,然后释放容器。所以首先是 Marshal.DestroyStructure 然后是 Marshal.FreeHGlobal

我不认为 CriticalFinalizerObject 与编码 struct 有任何关系,并且 struct 不能从任何东西继承,所以第一个问题的回答是否定的。

关于.net - .Net 中的 Marshal.DestroyStructure 与 Marshal.FreeHGlobal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31020249/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com