【问题标题】: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】:
这就是完成的全部意义,它是自动的。是的,它们会被调用,因为它们超出范围的方式与父最终过程超出范围时调用的方式相同。
如果您有一个指针组件,您可能需要显式释放,但即使这样,最终过程也会自动调用释放。