2011-05-24 10 views
0

を解放し得ていない私は、論理的に接続アーカンソーunmangedクラスとrefクラスを持っている:C++/CLI refのクラス

public ref class RefBlah 
{ 
    ~RefBlah(); 
    !RefBlah(); 

    internal: 

    UnManagedBlah* m_unmanaged; 
} 

public class UnManagedBlah 
{ 
    public: 
    gcroot<RefBlah^> refBlah; 
} 

RefBlahクラスは常にへの参照を保持しているUnManagedBlahのインスタンスを作成しますそれを作成したオブジェクト

RefBlahというインスタンスをC#アプリケーションで作成すると、スコープから外れると解放されません。 (私は待って、他のすべてのオブジェクトが解放されるのを見ましたが、それ自体を削除することを拒否します)。

私が知る限り、それらが両方の正規の.Netオブジェクトであった場合、参照カウントが0にならないため、クラスがスコープから外れると両方とも収集されます。メインスタックからのオブジェクト。

.NET GCは、アンマネージクラスからの参照を異なる方法で扱いますか?

RefBlahが破壊されるようにデザインを変更するにはどうすればよいですか?

答えて

3

私はあなたに循環参照問題があると思います。 RefBlahあなたはおそらくその後、管理対象外のクラス内の参照を、それがなければならない持っている必要がある場合..あなたはRefBlahなどでポインタを削除する場合にのみ発生しますGC'dさUnManagedBlahで参照されるまで

をGC'dを取得することはありません弱い参照ですか? GCHandle構造体を見て:

GCHandleクラスは、任意の オブジェクトを管理に対応する ハンドルを作成するために GCHandleType列挙で使用されています。このハンドルは、4種類のうちの1つです。Weak、WeakTrackResurrection、 Normal、またはPinned。ハンドルに が割り当てられている場合は、 を使用して、管理対象オブジェクトが がガベージコレクタ によって収集されないようにすることができます。このようなハンドルがなければ ガベージコレクタでオブジェクトを収集してから、 の非管理対象のクライアントの代わりに クライアントを処理することができます。

+0

ニースは、C#で弱い参照を作成できることを知りませんでした。彼らはそれを持っているだろう意味します:) –

+0

循環参考文献は.Netにはあまり影響しません。問題は、** UnManagedBlah **は管理されていないため、CLIは参照されているオブジェクトを管理されていないコードで参照している間は解放しません。しかし、この解決方法は問題を解決しました。 –