【问题标题】:Will a Fortran container class automatically call a contained object's destructor?Fortran 容器类会自动调用包含对象的析构函数吗?
【发布时间】:2018-09-16 00:09:52
【问题描述】:

假设我有以下装有一些眼镜的盒子类:

TYPE :: box_class
   TYPE(glass_class) :: cup1
   TYPE(glass_class) :: cup2
END TYPE

glass 类有析构函数的地方:

TYPE:: glass_class
  CONTAINS
   FINAL :: glass_destructor
END TYPE

当我的box 对象超出范围时,会自动调用glass_destructor,还是我需要在box 析构函数中手动调用glass_destructor

【问题讨论】:

    标签: oop fortran destructor


    【解决方案1】:

    派生类型glass_class 是可终结的,因为它有一个final 子例程。派生类型 box_class 是可终结的,即使没有 final 子例程,因为可终结的组件(非指针和不可分配)。

    现在,当type(box_class) 的对象最终确定时,我们将遵循最终确定过程(F2008,4.5.6.2):

    • 没有调用子程序来完成盒子对象;
    • 以与处理器相关的顺序调用杯子的最终子例程;
    • 不存在父最终子例程。

    总而言之:是的,如果您的盒子要最终确定,那么杯子将通过它最终确定。你不需要做更多的事情来明确这一点。

    【讨论】:

      【解决方案2】:

      这就是完成的全部意义,它是自动的。是的,它们会被调用,因为它们超出范围的方式与父最终过程超出范围时调用的方式相同。

      如果您有一个指针组件,您可能需要显式释放,但即使这样,最终过程也会自动调用释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-12
        • 2021-06-30
        • 2012-10-21
        • 2013-08-20
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多