[英]Cannot declare pointer to non unmanaged type int* C#
unsafe static void Main(string[] args)
{
int i=6;
int* j = &i; //Allowed
int* k = j; //Allowed
fixed(int* q = &i) //Allowed
{
}
fixed(int* q = j) //Cannot declare pointer to non unmanaged type int*
{
}
}
我對第二個固定塊的操作與我對第一個固定塊的操作幾乎相同。 我將變量i的地址分配給指針q。 允許直接地址分配,而在另一個指針中獲取地址並在分配中使用該指針失敗。 但是,在固定上下文之外,同樣的步驟也起作用。
您正在使用什么版本的C#? 第一個fixed
語句也不適合我編譯( You cannot use the fixed statement to take the address of an already fixed expression
)。
修復非托管指針沒有任何意義。 它已經修復,GC永遠無法觸及。
例如,當您使i
成為類的成員字段時,這種情況就會更改。 突然,它不再受方法限制, 可以由GC(及其計數對象)移動。 在這種情況下,您必須使用fixed
語句。
編譯器不允許您使用指向未修復的托管變量的指針,也不允許您修復未托管或修復的變量。
以同樣的方式,如果您將指針指向數組的開頭,例如 make int[] i
並取&i[0]
,這又需要修復,因為不再保證它是本地范圍的。 如果確實需要本地范圍內的非托管數組,則可以使用stackalloc
關鍵字,但是再次,這基本上意味着您要從托管.NET的相對安全中stackalloc
。
該fixed
語句用來釘住管理變量,因此垃圾回收不會動它。
在正常操作中,垃圾收集器可以自由移動對象。 這對於指針將是一個問題,因為如果垃圾回收器將您有指針的對象移動到該指針,則該指針將不再有效。 fixed
為您提供了解決方案,方法是讓您固定變量,告訴垃圾回收器該對象的指針可能存在,並且在代碼塊的持續時間內不得移動它們。
C#編譯器僅允許您在固定語句中將指針分配給托管變量。
分配在堆棧上的變量(值類型)不受垃圾收集器的約束,並且不會在內存中移動,因此,對於此類變量而言, fixed
既不必要又不正確。 這就是為什么您的第二個(實際上也是第一個) fixed
語句產生錯誤的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.