CLR 如何与不安全代码交互我在 Google 上找到了各种结果,但我无法理解。我也很困惑垃圾收集器是否在处理不安全的代码?如果是,比怎么样?
我不能将指针指向数组的第一个元素我试试这段代码
unsafe{
int[] a = { 4, 5 };
int* b = a;
}
但我得到了那个错误错误:无法将类型'int []'隐式转换为'int *'
垃圾收集器没有理由不能处理不安全的代码。我假设您正在谈论指向固定对象的指针,例如:
int[] arr = new int[100];
unsafe
{
fixed (int* p = arr)
{
// use p
}
}
在块 p 的末尾不再可访问,因此可以安全地收集它。
现在......这并不总是正确的。您可以将指针传递给其他函数,然后退出该块(想到 EnumWindows 系列函数,您可以在其中给它们一个指向结构的指针,然后可以使用您所在的函数来完成,它们自己处理其余部分) .
“GC.KeepAlive
函数”(read hack)用于处理这种情况,方法是将变量保持在范围内,直到你真正完成它 - 没错,它除了欺骗 GC 认为你仍在使用引用之外什么都不做。