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会自动更新这些引用的地址,确保引用始终指向正确的元素。
- .NET的GC在执行堆压缩时,会跟踪所有活跃的托管引用(包括
- 只有数组实例被GC回收后,引用才会失效,但你已经明确数组不会被应用程序修改(即不会被置空或替换),只要数组始终被托管代码的根引用持有(比如
this实例本身还存活),数组就不会被GC回收,对应的元素引用也就始终有效。 - 例外情况:如果将元素引用存储到非托管内存,或者用非托管方式持有该引用,GC无法跟踪到这个引用,此时数组被移动时,非托管持有的引用会失效。但在托管代码中正常使用(如局部变量、托管字段)时,不存在这个问题。
内容的提问来源于stack exchange,提问作者ssianky
相关产品推荐
相关产品推荐

