基本上,为什么在C++/CLI中有一个finalize析构函数。似乎GC在收集对象之前先检查是否手动调用了delete,如果不是,则调用终结器。那么,如果未调用delete,为什么GC不能只调用普通析构函数呢?

最佳答案

出于相同的原因,您在C#中拥有Dispose方法和Finalizer。粗略地说,在C++/CLI中,析构函数对应于Dispose,而Finalilzer对应于终结器。我粗略地说,因为C++/CLI为您实现了Dispose pattern。也就是说,如果调用delete(即调用析构函数),则可确保终结器被抑制。如果不是删除
调用,则终结器将在GC时运行。

就像在C#中一样

析构函数中的

  • 允许您清理托管对象和非托管对象。
  • 终结器中的
  • 只允许清除非托管对象,因为在此时间点(运行垃圾收集器时),该对象引用的其他托管对象可能已被清理。因此,(回答您的问题),GC调用析构函数是不正确的(因为析构函数可能具有清理托管资源的代码)。

  • 如果您有终结器,则析构函数调用终结器是常见的做法(也是一种很好的做法)。

    这两个链接可能也有帮助:
  • http://msdn.microsoft.com/en-us/library/ms177197(v=vs.90).aspx
  • https://stackoverflow.com/a/12340581/495262
  • 关于c++-cli - C++/CLI终结器的需求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24689213/

    10-10 21:53