0

CLRが安全でないコードとどのように相互作用するかGoogleでさまざまな結果を見つけましたが、理解できませんでした。ガベージコレクターが安全でないコードで動作していることも混乱していますか?はいの場合、どのように?

配列へのポインタを指すことができません、最初の要素このコードを試します

unsafe{

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

しかし、私はそのエラーを受け取りましたエラー:タイプ'int[]'を'int*'に暗黙的に変換できません

4

1 に答える 1

1

ガベージコレクターが安全でないコードで機能しない理由はありません。私はあなたが次のようなピン留めされたオブジェクトへのポインタについて話していると仮定しています:

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

ブロックの終わりでは、pはアクセスできなくなったため、安全に収集できます。

さて...これは常に正しいとは限りません。他の関数へのポインターを渡してからブロックを終了することもできます(EnumWindowsファミリーの関数は、構造体へのポインターを指定すると、現在の関数で実行でき、残りは自分で処理します) 。

GC.KeepAlive関数」(読み取りハック)は、変数を実際に使用するまでスコープ内に保持することでこのケースを処理するために使用されます。そうです、GCをだまして、まだ参照を使用していると思わせる以外は何もしません。

于 2010-07-17T07:35:47.573 に答える