1

安全でない環境では、fixedステートメントを使用することで、変数のアドレスを取得して固定できるため、取得したポインターを安全に操作できることがわかります。しかし、このポインタをどこかに安全に保存する方法はありますか? 同様に、ポインター自体が破棄されるまで、その変数を永続的に固定します。

integerたとえば、 //へのポインターをunsafe クラスのメンバーにしたい場合はどうすればよいでしょうfloatか?double

4

1 に答える 1

11

メモリを固定するためのより永続的な解決策は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

于 2013-03-04T12:00:35.177 に答える