2010-07-17 56 views
0

CLR如何與不安全的代碼交互我在Google上發現了各種結果,但我無法理解。我也很困惑,垃圾收集器工作在不安全的代碼?如果是,比如何?對不安全代碼的CLR和指向數組的指針?

我不能點的指針數組,第一個元素 我試試這個代碼

unsafe{ 

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

,但我得到的錯誤 錯誤:無法隱式轉換類型「詮釋[]」到「詮釋*」

回答

1

沒有理由垃圾回收器無法在不安全的代碼上工作。我假設你在談論指向固定的對象,如:

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

在塊P的到底是unaccesible了,所以它可以被安全回收。

現在......這並非總是如此。您可能會將指針傳遞給其他函數,然後退出該塊(EnumWindows函數系列可以讓您知道在哪裏給它們一個指向結構的指針,然後可以使用您所在的函數完成,它們自己處理其餘的函數) 。

GC.KeepAlive「函數」(讀取黑客)用於處理這種情況下,通過保持變量的範圍,直到你真的完成了它 - 沒錯,除了欺騙GC認爲你是仍然使用該參考。

+0

錯誤:無法將類型'int []'轉換爲'int *'plz糾正此問題 – 2010-07-17 07:54:57

+0

我不好意思忘了我不得不將其固定。已經有一段時間.. – Blindy 2010-07-17 08:10:36