以下の C# コードがクラッシュしない理由を誰か説明してもらえますか? Visual Studio で実際にコンパイルできるのはなぜですか? 私の理解では、固定ポインターを取得していますが、「固定」ステートメント内でのみ固定されています。「Foo」関数からポインタが返されると、配列「ar」が収集される場合があります。次に、GC に実際にこれを実行させますが、メモリ (現在は割り当て解除されています) に連続して書き込みを行ってもエラーは発生しません。
class Program
{
static unsafe byte* Foo()
{
byte[] ar = new byte[100];
fixed (byte* ptr = ar)
{
return ptr;
}
}
static unsafe void Main(string[] args)
{
byte* ptr = Foo();
GC.Collect();
for (int t = 0;;++t) ptr[t%100] = 0;
}
}