ネイティブ オブジェクトのみを削除し、マネージド オブジェクトが他の場所で参照されていない場合、ガベージ コレクションは行われますか?
それがガベージコレクションの本質です。オブジェクトへの参照が見つからない場合、コレクターはオブジェクトを破棄します。gcroot<> テンプレート クラスを使用する場合は少し異なります。コレクターがマネージド オブジェクトへの参照を見つける "通常の" 方法は、CPU レジスター、マネージド コードのスタック、およびマネージド ヒープでそれらを検出することです。これはネイティブ コードでは機能しません。gcroot<> クラスが役立ちます。
gcroot<> コンストラクターは、GCHandle::Alloc() を呼び出して、オブジェクトへの明示的な参照を割り当てます。そのデストラクタは、GCHandle::Free() を呼び出してそれを削除します。これらの「追跡ハンドル」を割り当てることができるのは、CLR の二次的なメカニズムであり、コレクターが自身で見つけた参照に加えて参照するそれらのテーブルを維持します。
最終的な効果は、クラス デストラクタが実行されると、自動的に gcroot<> デストラクタが呼び出されることです。オブジェクト参照がなくなりました。それが唯一の参照だった場合 (この場合は非常に可能性が高い)、次のガベージ コレクション スイープでオブジェクトが破棄されます。自動的。後で。