これが私の状況です:
アンマネージC++オブジェクトへのポインターを保持する.NETラッパーオブジェクトがC++/CLIレイヤーにあります。ファイナライザーを実装して、ガベージコレクションのラッパーオブジェクトが指すアンマネージメモリを削除し、ポインターをnullに設定しました。
ここに問題があります:
.NETラッパーオブジェクトのファイナライザーを監視していますが、2回呼び出され、同じメモリを2回削除しようとします。これは、スコープ外になり、ガベージコレクションされる2つの.NETラッパーオブジェクトを作成したことを示しています。ラッパーオブジェクトがスコープ内にあることをまだ期待しています(これらのラッパーオブジェクトはVB.NETアプリケーションに渡されます)。
これが私の質問です:
とにかく、ラッパーオブジェクトが作成されている場所(コピーなど)を確認できるように、ハンドル値を確認することはできますか?現在、ハンドル値(EG-0x0014fe80)を調べていますが、オブジェクトが作成され、コレクションに追加され、削除されたときの3つの異なる値が表示されます。したがって、GCが何かを移動しているだけで、これが同じオブジェクトなのか、それとも同じアンマネージメモリを参照する3つの異なるオブジェクトが実際に表示されているのかはわかりません。可能であれば重複したオブジェクトのコピーを解決したいのですが、これが起こらないように、おそらく何らかのスマートポインターを実装したいと思うでしょう。
ありがとう、イアン