gpt4 book ai didi

c# - 我可以从对象中获取固定对象的 GCHandles 吗?

转载 作者:行者123 更新时间:2023-11-30 12:17:10 25 4
gpt4 key购买 nike

我在 .NET 上固定一个对象并获得一个 GCHandle。我想泄露大部分这些 GCHandle 并忘记它们(因此对象继续被固定)。稍后,对于一些对象,我想取消固定它们。那时我只有对象(或对象的地址)。

似乎每个 GCHandle 固定调用都会返回一个新的 GCHandle。GCHandle.ToIntPtr 和 GCHandle.FromIntPtr 显示 native 整数等同于这些 GCHandles。

是否可以从对象或 AddrOfPinnedObject 获取 GCHandle?

最佳答案

不,一旦你失去了一个 GCHandle,那么你就永远失去了它。垃圾收集器中没有“句柄对句柄”的概念。您只能为一个对象创建一个 GCHandle,它会添加一个额外的引用。这个丢失句柄引用的对象将被永久引用,这是一个泄漏。请注意,GCHandle 是一种结构类型。

将对象固定任何时间的想法对程序的性能是有害的。除了让 GC 更难绕过障碍之外,它还会阻止它正确地压缩堆。这增加了缓存未命中的可能性,这在现代内核上非常昂贵。这些副作用可能会持续一段时间。

如果您需要固定内存,则使用 Marshal.AllocCoTaskMem() 分配它。这也会阻止您创建指向具有不可预测内存布局的托管数据的指针。不同版本的 JIT 编译器之间的布局不同,并且高度依赖于结构或类声明。只有 Marshal.StructureToPtr() 可以给你硬性保证。

关于c# - 我可以从对象中获取固定对象的 GCHandles 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145187/

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