簡體   English   中英

fixed關鍵字從不安全的上下文中鎖定內存中的引用類型變量?

[英]fixed keyword to lock a reference type variable in memory from an unsafe context?

下面是處理指針類型時不使用fixed的代碼:

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指向不同的PointRef對象,因為pt = new PointRef { x = 1 }; ),所以在UseAndPinPoint之前對象不會被垃圾收集( )方法完成。

pt.x是一個固定變量 ,你只需要對可移動變量使用fixed語句,這在文檔中都很清楚

固定和可移動變量

固定變量駐留在不受垃圾收集器操作影響的存儲位置。 (固定變量的示例包括局部變量,值參數和通過解除引用指針創建的變量。)另一方面,可移動變量駐留在由垃圾收集器進行重定位或處理的存儲位置。 (可移動變量的示例包括對象中的字段和數組的元素。)

&運算符(運算符地址)允許無限制地獲得固定變量的地址 但是,由於可移動變量需要由垃圾收集器進行重定位或處理, 因此只能使用固定語句 (固定語句) 獲取可移動變量的地址 ,並且該地址僅在該固定語句的持續時間內有效。

准確地說,固定變量是以下之一:

  1. 由simple_name(簡單名稱)引用的變量,引用局部變量或值參數,除非該變量由匿名函數捕獲。
  2. 由表單VI的member_access(成員訪問)產生的變量,其中V是struct_type的固定變量
  3. 由形式為P的pointer_indirection_expression(指針間接),P-> I形式的pointer_member_access(指針成員訪問)或形式P [E]的pointer_element_access(指針元素訪問)產生的變量。

所有其他變量都歸類為可移動變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM