【问题标题】:What is the correct way to access and manipulate pinned memory using GCHandle.Alloc()?使用 GCHandle.Alloc() 访问和操作固定内存的正确方法是什么?
【发布时间】:2020-01-19 01:21:09
【问题描述】:

我正在尝试更好地了解如何将内存固定到更长的时间。很明显GCHandle.Alloc(..., GCHandleType.Pinned) 是我需要使用的(超过fixed(){})。

不过,我希望能对它的使用做一些说明。

如果我分配一个数组然后使用GCHandle 固定它:

byte[] data = new byte[10];
GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);

如果我像这样操作data 数组:

for(int i = 0; i < data.length; i++) {
    data[i] = i;
}

我还在内存的固定区域上操作吗?还是只能通过handle.AddrOfPinnedObject()函数访问这个内存?

我确信这可能是一个非常基本的问题,但我们将不胜感激任何帮助!

【问题讨论】:

    标签: c# .net memory garbage-collection


    【解决方案1】:

    原始对象仍然可以使用 - 因为它仍然由给定变量命名,所以继续使用它。 创建了一个新对象,而现有对象无效。所以,是的,代码将“在内存的固定区域上操作”。

    GCHandle.Alloc(.., GCHandleType.Pinned) 的行为是:

    • 在调用 Free 之前无法对对象进行 GC,即使它不再是强可达的。如果句柄被“遗忘”,这可能会导致 [true] 内存泄漏。

    • 在 GC 压缩周期期间不能移动对象,也不能在 GC 代之间移动对象。这可能会导致 GC 性能/效率降低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2014-09-26
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多