2012-01-19 1 views
1

ネイティブポインタがマネージヒープを指すことができる方法があるのだろうか?ヒープコンパクションとGCサイクルがオブジェクトアドレスを変更することを考えると、これは危険なことだと私は知っていますが、それでも可能ですか?例が分かるだろう。C++ CLIのネイティブポインタとハンドルポインタ

また、ハンドル(^)がネイティブヒープをまったく指すことができないのは本当ですか?

ありがとうございました。

+0

あなたがしようとしていることは正確にはわかりませんが、私のすべてのアプリケーションでは、このようなことをすることは不必要であることがわかりました。マネージドクラス内のアンマネージヒープへのポインタと、アンマネージクラス内のマネージヒープへのハンドルを持つすべての問題を解決できました。 – Ian

答えて

5

はい、これはサポートされていますが、指し示すオブジェクトはピンで固定されている必要があります。 .NETのGCHandle :: Alloc()を使用するか、C++/CLI pin_ptr<>クラスを使用します。オブジェクトを長い間固定するのは悪いです。道路の岩の周りを動かす必要があるため、ガベージコレクタには苦労します。ネイティブコードを呼び出すときは、固定が非常に一般的です。

ネイティブヒープ内のブロックに対する追跡参照(ハット)は意味をなさないので、ガベージコレクションヒープ内のオブジェクトのみを追跡します。