本机和托管析构函数

时间:2012-06-16 20:41:18

标签: c# c++-cli

我有一个本机对象(C ++),它有一个指向托管对象(C#)的gcroot指针。

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

问题 当我在之前分配的本机代码delete(someNativeClass)中删除此类的本机实例时,managedClass实例是否会被垃圾收集,或者我是否应该显式删除它(在本机析构函数中)?

1 个答案:

答案 0 :(得分:9)

  

如果只删除本机对象并且其他地方没有引用托管,是否会被垃圾回收?

这就是垃圾收集的本质。收集器在找不到对象的引用时会销毁该对象。当你使用gcroot&lt;&gt;时,它会有所不同。模板类,收集器找到对托管对象的引用的“正常”方式是通过在cpu寄存器中发现它们以及托管代码和托管堆栈的堆栈。这在本机代码中无效,gcroot&lt;&gt;上课有所帮助。

gcroot&lt;&gt;构造函数调用GCHandle :: Alloc()来为对象分配显式引用。它的析构函数调用GCHandle :: Free()来删除它。能够分配这些“跟踪句柄”是CLR中的辅助机制,它为它们维护一个表,除了它自己找到的引用之外,收集器还可以查询它。

净效果是当你的类析构函数运行时,它会自动调用gcroot&lt;&gt;析构函数。对象引用消失了。如果那是唯一的参考,很可能在这种情况下,下一次垃圾收集扫描会破坏对象。自动。后面。