我有一个解析文本文件的对象。这是我的主要计划:
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
对象。但是我怎么能这样做,或者处理释放过程的正确方法是什么?
答案 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。