関数内から安全でないポインターを返すことができるのはなぜですか?
質問
私は最近、実際にこれを行ういくつかのオープンソースプロジェクトを見ました。 「int* input = this.someiterator.getunsafeptr()などの関数から安全でないポインターを返します。
私の理解から、これは完全に間違っている必要があります。安全でないポインターは「固定」ステートメントによってのみ取得できます。また、関数内から返されたステートメントは確かにピン留めされなくなり(宣言する範囲を「失う」ため)、最終的にはゴミを収集します。
しかし、その後、コンパイラがこれについて警告を出したことを覚えていないので、実際に「編成されていない」ポインターが広がっているのに、なぜ固定声明を使用することを気にするのでしょうか?
解決
私はオープンソースプロジェクトでそのような構造を見たことがありません。質問でそのような使用のサンプルを提供する方が良いでしょう。それの意味は行動に依存する可能性があります。
しかし、私は同意します、安全でないポインターは悪であり、いくつかのネイティブライブラリまたはコードと対話する場合にのみ使用する必要があります。
私が覚えている限り、この構造は安全でないブロックでのみ使用できます。ですから、コンパイラはここで警告を出さないと思います。 IMO INTPTRを使用する方が良いです(安全でないブロックは、フルストでのみ実行できます)。
編集:
@Stephenは正しい、INTPTRはGCコレクションのオブジェクトへの参照を保持しません。
他のヒント
どうですか、 Marshal.AllocHGlobal
また Marshal.AllocCoTaskMem
, 、両方とも自由にキャストできるINTPTRを返します void *
を使用して .ToPointer()
関数 ?
または、ポインターが管理されていないコードに由来する場合があります。必要がある fix/pin
メモリは管理されているため、したがって、そうでない限り fixed/pinned
ゴミコレクターは自由に移動でき、ポインターが無効になります。