1

これが私の状況です:

アンマネージC++オブジェクトへのポインターを保持する.NETラッパーオブジェクトがC++/CLIレイヤーにあります。ファイナライザーを実装して、ガベージコレクションのラッパーオブジェクトが指すアンマネージメモリを削除し、ポインターをnullに設定しました。

ここに問題があります

.NETラッパーオブジェクトのファイナライザーを監視していますが、2回呼び出され、同じメモリを2回削除しようとします。これは、スコープ外になり、ガベージコレクションされる2つの.NETラッパーオブジェクトを作成したことを示しています。ラッパーオブジェクトがスコープ内にあることをまだ期待しています(これらのラッパーオブジェクトはVB.NETアプリケーションに渡されます)。

これが私の質問です:

とにかく、ラッパーオブジェクトが作成されている場所(コピーなど)を確認できるように、ハンドル値を確認することはできますか?現在、ハンドル値(EG-0x0014fe80)を調べていますが、オブジェクトが作成され、コレクションに追加され、削除されたときの3つの異なる値が表示されます。したがって、GCが何かを移動しているだけで、これが同じオブジェクトなのか、それとも同じアンマネージメモリを参照する3つの異なるオブジェクトが実際に表示されているのかはわかりません。可能であれば重複したオブジェクトのコピーを解決したいのですが、これが起こらないように、おそらく何らかのスマートポインターを実装したいと思うでしょう。

ありがとう、イアン

4

2 に答える 2

1

この質問を見てくださいこれは、@Ben Voigtによる、コピー不可能で、管理されていないオブジェクトの自動解放メカニズムを持つa の実装です
scoped_ptr

于 2011-10-04T10:02:26.127 に答える
0

ええ、auto_ptr クラスを共有ポインターに変更して、アンマネージ メモリがスマート ポインター ファイナライザーによって 1 回だけ削除されるようにしました。他のすべての実装と同様のことをしたと仮定しています。ネイティブ ポインター値をキーとして使用して auto_ptr テンプレート クラスに静的辞書を作成しました。これは、ファイナライザーが呼び出されて各項目のカウントを更新するか、メモリを削除するたびにチェックされます。

于 2011-10-04T16:33:21.037 に答える