C++ cli 对C++/析构函数

C++ cli 对C++/析构函数,c++-cli,C++ Cli,基本上,为什么C++/CLI中有finalize析构函数。似乎GC在收集对象之前会检查是否手动调用了delete,如果没有,则调用终结器。那么,如果没有调用delete,为什么GC不能调用普通的析构函数呢?同样的原因是,在C#中有一个Dispose方法和一个Finalizer。粗略地说,在C++/CLI中,析构函数对应于Dispose,Finalilzer对应于finalizer。我粗略地说,因为C++/CLI为您实现了。也就是说,如果调用delete(即调用析构函数),它将确保取消终结器。如果

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

同样的原因是,在C#中有一个Dispose方法和一个Finalizer。粗略地说,在C++/CLI中,析构函数对应于Dispose,Finalilzer对应于finalizer。我粗略地说,因为C++/CLI为您实现了。也就是说,如果调用delete(即调用析构函数),它将确保取消终结器。如果没有删除 调用,则终结器将在GC时运行

就像在C中一样#

  • 在析构函数中,您可以清理托管对象和非托管对象
  • 在终结器中,只允许清理非托管对象,因为此时(垃圾收集器运行时),此对象引用的另一个托管对象可能已清理。因此,(为了回答您的问题),GC调用析构函数是不正确的(因为析构函数可能有清理托管资源的代码)
如果有终结器,析构函数调用终结器是常见的(也是良好的做法)

这两个链接也可能有所帮助: