【问题标题】:The need for C++/CLI finalize destructor需要 C++/CLI finalize 析构函数
【发布时间】:2014-07-11 02:21:55
【问题描述】:

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

【问题讨论】:

    标签: c++-cli


    【解决方案1】:

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

    就像在 C# 中一样

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

    如果你有一个终结器,那么析构函数调用终结器是很常见的(也是很好的做法)。

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

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 2014-02-26
      • 2017-06-02
      • 1970-01-01
      • 2019-01-09
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多