如何在Fortran中正确完成一个对象?

时间:2016-11-18 12:52:02

标签: fortran finalizer

我有一个解析文本文件的对象。这是我的主要计划:

program main
use Parser_class 
implicit none
type(Parser) :: Parser
call Parser%ProcessFile('data.txt')
call Parser%Deallocate
end program main

其中类型定义为

module Parser_class
type :: Parser
contains
    procedure, public :: ProcessFile
    procedure, public :: Deallocate
end type Parser
contains
    subroutine ProcessFile(self)
    ...
    end subroutine 
    subroutine Deallocate(self)
    class(Parser) :: self
    ...
    end subroutine 
end module Parser_class

我阅读了关于final关键字并将类型定义更改为

module Parser_class
type :: Parser
contains
    procedure, public :: ProcessFile
    final :: Deallocate
end type Parser
contains
    subroutine ProcessFile(self)
    ...
    end subroutine 
    subroutine Deallocate(self)
    type(Parser) :: self
    ...
    end subroutine 
end module Parser_class

此外,在主程序中,我还没有call Parser%Deallocate。终结者现在不会随时被调用。我以某种方式得到这个是因为我永远不会破坏或覆盖Parser对象。但是我怎么能这样做,或者处理释放过程的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

在Fortran 2008标准中,当最终确定出现时,请参见第4.5.6.3节 1 。我不会一直在这里复制,但我会总结一下。

从何时开始,明确提到的是什么时候:

  

如果图像执行因错误(例如分配失败)或stop-stmt,error-stop-stmt或end-program-stmt的执行而终止,则在终止之前存在的实体未最终确定

这涵盖了您的计划。 Parser在程序的范围内,它仍然存在于程序的最后。没有明显的其他事情会导致最终确定。

如果Deallocate是该类型的最终过程,那么有一些微妙的方法可以使该类型对象的最终确定与对类型绑定过程的调用不同。在最终确定中,该过程是递归的:组件和父母本身都需要最终确定。通过子程序调用,递归必须以某种方式手动显示。

在许多情况下,人们并不关心实体在计划结束时是否最终确定。毕竟,任何解除分配都是操作系统的问题,而不是程序员的问题。但是,有时候其他形式的整理确实是可取的。

可以通过某种方式强制进行真正的终结。如果检查下面的列表,可以考虑两个选项:

  • 使Parser对象可分配并显式解除分配;
  • 将整个事物包裹在block构造中。

粗略地总结最终确定时间:

  • 当有释放(指针或可分配)时;
  • 作为程序启动时使用intent(out)参数;
  • 到达可执行构造或子程序的末尾时,对于未保存的本地对象;
  • 就在对变量进行内部赋值之前;
  • 函数结果的值完成后。

1 如果您没有阅读文档的最终形式,那么您需要假装paragraphs 5 and 7 don't exist