安全でない環境では、fixedステートメントを使用することで、変数のアドレスを取得して固定できるため、取得したポインターを安全に操作できることがわかります。しかし、このポインタをどこかに安全に保存する方法はありますか? 同様に、ポインター自体が破棄されるまで、その変数を永続的に固定します。
integerたとえば、 //へのポインターをunsafe クラスのメンバーにしたい場合はどうすればよいでしょうfloatか?double
メモリを固定するためのより永続的な解決策はGCHandle、次のようにクラスを使用することです。
var handle = GCHandle.Create(myObject, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();
//... use it
handle.Free();
これにより、固定されたオブジェクトのアドレスを取得でき、GC がオブジェクトを移動するのを防ぐことができます。ただし、GCHandle完了したら、生き続けて解放する必要があります。fixed()これは、ブロックを使用するよりも、多くのメソッドまたはクラスにまたがる方がはるかに簡単です。
ただし、メモリを固定するとパフォーマンスが低下する可能性があることに注意してくださいGC。
決して移動されないメモリのチャンクが必要な場合は、ネイティブ コードなどと相互運用するために使用しているため、 と を干渉しない移動不可能なメモリを割り当てるために、と の使用Marshal.AllocHGlobal()を検討してください。Marshal.FreeHGlobal()GC