安全でない環境では、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