質問

私たちのプロジェクトの1つには、次のようなコードがあります。誰でもここで修正された声明が必要な理由を(簡単な英語で)説明できますか?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
役に立ちましたか?

解決

メモリ内のポインタを修正します。ガベージコレクションされた言語は、効率のためにオブジェクトをメモリ内で自由に移動できます。プログラマーは、「通常」のポインターを実際に使用しないため、プログラマーに対してすべて透過的です。 CLRコード。ただし、ポインターが必要な場合は、それらを使用したい場合はメモリー内で修正する必要があります。

他のヒント

修正されたステートメントは、"ピン" ;ガベージコレクターが収集時に移動しないように、メモリ内の変数。変数を移動すると、ポインターが役に立たなくなり、使用したときに意図しないものにアクセスまたは変更しようとすることになります。

ガベージコレクターがポインターを移動させないように、ポインター演算を行うあらゆる場所で必要になります。

安全でないモード(ポインター)で実行しているため、固定命令はその変数に特定のメモリ空間を割り当てます。固定命令を付けなかった場合、ガベージコレクターは必要に応じて、メモリ内で変数をどこにでも移動できます。

このヘルプをお待ちしています。

MSDN には非常によく似た例があります。 fixedステートメントは、基本的にガベージコレクションをブロックします。 .Netでは、メモリの場所へのポインターを使用すると、ランタイムはオブジェクトを" better"に再割り当てできます。いつでも場所。したがって、メモリに直接アクセスする場合は、メモリを適切に修正する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top