固定的关键字,以锁定来自不安全上下文的引用类型变量在内存中?

时间:2019-06-05 05:11:14

标签: c# .net garbage-collection

下面是处理指针类型时未使用固定代码的代码:

class PointRef 
{
   public int x;
}

public unsafe static void UseAndPinPoint() 
{
   PointRef pt = new PointRef { x = 5 };
   int* p = &pt.x;
   ... Use int* variable here!
   Console.WriteLine("Point is: {0}", pt);
}

我的教科书上说必须使用固定关键字,否则,不安全的上下文有可能试图与世代扫除后无法访问或已重新放置在堆上的成员进行交互。

在示例中,我不太了解。并不是说pt总是指向引用的对象(如果我们不将pt重新分配为指向pt = new PointRef { x = 1 };的另一个PointRef对象),那么在UseAndPinPoint()方法完成之前,不会垃圾回收该对象。 / p>

1 个答案:

答案 0 :(得分:0)

pt.x是一个固定变量,您只需要在可移动变量上使用fixed语句,这在文档

Fixed and moveable variables

  

固定变量位于不受以下方面影响的存储位置   垃圾收集器的操作。 (固定变量示例   包括局部变量,值参数和由...创建的变量   解引用指针。)另一方面,可移动变量驻留   存放在可能由   垃圾收集器。 (可移动变量的示例包括   对象和数组元素。)

     

&运算符(地址运算符)允许无限制地获取固定变量的地址。但是,因为   可移动变量应由   垃圾收集器,可移动变量的地址只能是   使用固定声明(固定声明)获得的结果,   该地址仅在该固定语句期间有效。

     

确切地说,固定变量是以下之一:

     
      
  1. 由simple_name(简单名称)产生的变量,该变量引用局部变量或值参数,除非该变量为   被匿名函数捕获。
  2.   
  3. 由形式为V.I的member_access(成员访问)产生的变量,其中V是struct_type的固定变量
  4.   
  5. 由* P形式的pointer_indirection_expression(指针间接)产生的变量,pointer_member_access(指针成员)   访问)的形式为P-> I,或者是pointer_element_access(指针元素   访问)的形式P [E]。
  6.   
     

所有其他变量都归为可移动变量。