関数内から安全でないポインターを返すことができるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/574874

  •  05-09-2019
  •  | 
  •  

質問

私は最近、実際にこれを行ういくつかのオープンソースプロジェクトを見ました。 「int* input = this.someiterator.getunsafeptr()などの関数から安全でないポインターを返します。

私の理解から、これは完全に間違っている必要があります。安全でないポインターは「固定」ステートメントによってのみ取得できます。また、関数内から返されたステートメントは確かにピン留めされなくなり(宣言する範囲を「失う」ため)、最終的にはゴミを収集します。

しかし、その後、コンパイラがこれについて警告を出したことを覚えていないので、実際に「編成されていない」ポインターが広がっているのに、なぜ固定声明を使用することを気にするのでしょうか?

役に立ちましたか?

解決

私はオープンソースプロジェクトでそのような構造を見たことがありません。質問でそのような使用のサンプルを提供する方が良いでしょう。それの意味は行動に依存する可能性があります。
しかし、私は同意します、安全でないポインターは悪であり、いくつかのネイティブライブラリまたはコードと対話する場合にのみ使用する必要があります。
私が覚えている限り、この構造は安全でないブロックでのみ使用できます。ですから、コンパイラはここで警告を出さないと思います。 IMO INTPTRを使用する方が良いです(安全でないブロックは、フルストでのみ実行できます)。
編集:
@Stephenは正しい、INTPTRはGCコレクションのオブジェクトへの参照を保持しません。

他のヒント

どうですか、 Marshal.AllocHGlobal また Marshal.AllocCoTaskMem, 、両方とも自由にキャストできるINTPTRを返します void * を使用して .ToPointer() 関数 ?

または、ポインターが管理されていないコードに由来する場合があります。必要がある fix/pin メモリは管理されているため、したがって、そうでない限り fixed/pinned ゴミコレクターは自由に移動でき、ポインターが無効になります。

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