0

CLR 如何与不安全代码交互我在 Google 上找到了各种结果,但我无法理解。我也很困惑垃圾收集器是否在处理不安全的代码?如果是,比怎么样?

我不能将指针指向数组的第一个元素我试试这段代码

unsafe{

  int[] a = { 4, 5 };
  int* b = a;
  }

但我得到了那个错误错误:无法将类型'int []'隐式转换为'int *'

4

1 回答 1

1

垃圾收集器没有理由不能处理不安全的代码。我假设您正在谈论指向固定对象的指针,例如:

int[] arr = new int[100];
unsafe
{
     fixed (int* p = arr)
     { 
          // use p
     }
}

在块 p 的末尾不再可访问,因此可以安全地收集它。

现在......这并不总是正确的。您可以将指针传递给其他函数,然后退出该块(想到 EnumWindows 系列函数,您可以在其中给它们一个指向结构的指针,然后可以使用您所在的函数来完成,它们自己处理其余部分) .

GC.KeepAlive函数”(read hack)用于处理这种情况,方法是将变量保持在范围内,直到你真正完成它 - 没错,它除了欺骗 GC 认为你仍在使用引用之外什么都不做。

于 2010-07-17T07:35:47.573 回答