'固定GC手柄'背后的概念是什么?

时间:2011-01-18 10:31:21

标签: .net wpf garbage-collection

当我们分析内存堆时,我们通常会遇到以下4种类型的GC句柄:

  1. 弱: - 弱GC句柄不会阻止它对应的实例被垃圾收集。 Example, used by the System.WeakReference class instances

  2. 正常: - 普通的GC句柄可防止相应的实例被垃圾回收。Example, used by the instances of strong references

  3. RefCounted: - 引用计数GC句柄由运行时内部使用,example, when dealing with COM interfaces.

  4. 固定: - 为什么我们需要这种GC手柄?是否只是为了避免该实例在内存中的移动或is there any other notion behind this? I want to know the notion behind Pinned GC handle(with an example).

  5. 为Itay的回答编辑: - 我有一个非空数组 - DiffCell [] [] ,它绑定到数据网格中WPF。当我关闭存在此数据网格的窗口时,在堆上我看到固定GC句柄通过 DiffCell 数组> object [] (参见快照)。 I am not using any unsafe code. I am just setting ItemsSource of data grid to null before closing that window. So my question is who does pin this array on heap and why?

    alt text

2 个答案:

答案 0 :(得分:7)

如果我们使用指针,我们需要这个 想象一下,你声明了一个指向内存位置的指针而你没有插入。
GC有时会将内存块移动到其他位置,因此指针将无效。

例如:

public unsafe void DoSomething(byte b)
{
   byte * bp = &b;
}

这将无法编译,因为您没有修复保存该字节的内存位置 为了固定它你可以使用:

public unsafe void DoSomething(byte b)
{
   fixed(byte * bp = &b)
   {
        //do something
   }
}

答案 1 :(得分:3)

不要忘记支持固定对象的GCHandle(并将地址检索为IntPtr)。固定对象不是不安全代码(固定语句)所独有的。