我有一个本机对象(C ++),它有一个指向托管对象(C#)的gcroot
指针。
class SomeNativeClass {
gcroot<SomeManagedClass ^> managedClass;
};
问题
当我在之前分配的本机代码delete(someNativeClass)
中删除此类的本机实例时,managedClass
实例是否会被垃圾收集,或者我是否应该显式删除它(在本机析构函数中)?
答案 0 :(得分:9)
如果只删除本机对象并且其他地方没有引用托管,是否会被垃圾回收?
这就是垃圾收集的本质。收集器在找不到对象的引用时会销毁该对象。当你使用gcroot&lt;&gt;时,它会有所不同。模板类,收集器找到对托管对象的引用的“正常”方式是通过在cpu寄存器中发现它们以及托管代码和托管堆栈的堆栈。这在本机代码中无效,gcroot&lt;&gt;上课有所帮助。
gcroot&lt;&gt;构造函数调用GCHandle :: Alloc()来为对象分配显式引用。它的析构函数调用GCHandle :: Free()来删除它。能够分配这些“跟踪句柄”是CLR中的辅助机制,它为它们维护一个表,除了它自己找到的引用之外,收集器还可以查询它。
净效果是当你的类析构函数运行时,它会自动调用gcroot&lt;&gt;析构函数。对象引用消失了。如果那是唯一的参考,很可能在这种情况下,下一次垃圾收集扫描会破坏对象。自动。后面。