2

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

私の理解では、これは完全に間違っているに違いありません。安全でないポインターは「固定」ステートメントを介してのみ取得でき、確かに関数内から返されたポインターは固定されなくなり (宣言スコープが「失われます」)、最終的にガベージ コレクションが行われます。

しかし、コンパイラがこれについて警告したことも覚えていないので、実際に「固定されていない」ポインタがいたるところに広がっている可能性がある場合、わざわざ固定ステートメントを使用する必要はありません。

4

2 に答える 2

3

関数を使用して自由にキャストできる IntPtr を返す、Marshal.AllocHGlobalまたは両方についてはどうですか?Marshal.AllocCoTaskMemvoid *.ToPointer()

または、ポインターがアンマネージ コードから生成されている可能性があります。メモリが管理されているため、メモリが必要ですfix/pin。したがって、ガベージ コレクターが自由に移動できない限りfixed/pinned、ポインタは無効になります。

于 2009-02-22T12:58:45.020 に答える
2

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

于 2009-02-22T13:04:25.723 に答える