-
03-07-2019 - |
题
我们的一个项目中有类似的代码。任何人都可以解释(简单英语)为什么需要修复语句?
class TestClass
{
int iMyVariable;
static void Main()
{
TestClass oTestClass = new TestClass();
unsafe
{
fixed (int* p = &oTestClasst.iMyVariable)
{
*p = 9;
}
}
}
}
解决方案
它将指针固定在内存中。垃圾收集语言可以自由地在内存周围移动对象以提高效率。这对程序员来说都是透明的,因为他们并没有真正使用“正常”指针。 CLR代码。但是,当你需要指针时,如果你想使用它们,你需要在内存中修复它。
其他提示
固定声明将“固定” ;内存中的变量,以便垃圾收集器在收集时不会移动它。如果确实移动了变量,指针将变得无用,当你使用它时,你将试图访问或修改你不想要的东西。
你需要在任何地方进行指针运算,以防止垃圾收集器在你身上移动它。
因为您在不安全模式(指针)中运行,所以固定指令会为该变量分配特定的内存空间。如果你没有放入固定的指令,垃圾收集器可以随时随地在内存中移动变量。
希望得到这个帮助。
MSDN 有一个非常相似的例子。 fixed语句基本上阻止了垃圾收集。在.Net中,如果使用指向内存位置的指针,运行时可以将对象重新分配给“更好”的对象。任何时候的位置。因此,如果您想直接访问内存,则需要将其修复到位。
不隶属于 StackOverflow