12

gcroot管理対象オブジェクト(C#)へのポインターを持つネイティブオブジェクト(C ++)があります。

class SomeNativeClass {
    gcroot<SomeManagedClass ^> managedClass;
};

質問delete(someNativeClass)以前に割り当て たネイティブコードでこのクラスのネイティブインスタンスを削除すると、managedClassインスタンスはガベージコレクションされますか、それとも(ネイティブデストラクタで)明示的に削除する必要がありますか?

4

1 に答える 1

9

ネイティブ オブジェクトのみを削除し、マネージド オブジェクトが他の場所で参照されていない場合、ガベージ コレクションは行われますか?

それがガベージコレクションの本質です。オブジェクトへの参照が見つからない場合、コレクターはオブジェクトを破棄します。gcroot<> テンプレート クラスを使用する場合は少し異なります。コレクターがマネージド オブジェクトへの参照を見つける "通常の" 方法は、CPU レジスター、マネージド コードのスタック、およびマネージド ヒープでそれらを検出することです。これはネイティブ コードでは機能しません。gcroot<> クラスが役立ちます。

gcroot<> コンストラクターは、GCHandle::Alloc() を呼び出して、オブジェクトへの明示的な参照を割り当てます。そのデストラクタは、GCHandle::Free() を呼び出してそれを削除します。これらの「追跡ハンドル」を割り当てることができるのは、CLR の二次的なメカニズムであり、コレクターが自身で見つけた参照に加えて参照するそれらのテーブルを維持します。

最終的な効果は、クラス デストラクタが実行されると、自動的に gcroot<> デストラクタが呼び出されることです。オブジェクト参照がなくなりました。それが唯一の参照だった場合 (この場合は非常に可能性が高い)、次のガベージ コレクション スイープでオブジェクトが破棄されます。自動的。後で。

于 2012-06-16T21:26:15.233 に答える