You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MemoryMarshal返回的引用与GC交互及引用有效性问询

GC对数组元素引用的影响分析

相关代码

获取元素引用的方法

private ref TE ElementRef(uint Index)
{
    ref TE Data = ref MemoryMarshal.GetArrayDataReference(this.Objects);
    return ref Unsafe.Add(ref Data, Index);
}

调用示例

ref TE ElementRef = ref this.ElementRef(Index);

问题

假设数组this.Objects不会被应用程序修改(即不会被赋值为null或新的数组实例),想了解GC可能产生的影响,以及上述代码获取的元素引用是否会变得无效?

分析结论

  • 只要数组this.Objects实例未被GC回收,你获取的元素引用就不会因为GC操作失效。
    • .NET的GC在执行堆压缩时,会跟踪所有活跃的托管引用(包括ref类型的引用),当数组被移动到新的内存位置时,GC会自动更新这些引用的地址,确保引用始终指向正确的元素。
  • 只有数组实例被GC回收后,引用才会失效,但你已经明确数组不会被应用程序修改(即不会被置空或替换),只要数组始终被托管代码的根引用持有(比如this实例本身还存活),数组就不会被GC回收,对应的元素引用也就始终有效。
  • 例外情况:如果将元素引用存储到非托管内存,或者用非托管方式持有该引用,GC无法跟踪到这个引用,此时数组被移动时,非托管持有的引用会失效。但在托管代码中正常使用(如局部变量、托管字段)时,不存在这个问题。

内容的提问来源于stack exchange,提问作者ssianky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:32:39