Memory management 编译器中的final必须是元素还是bug

Memory management 编译器中的final必须是元素还是bug,memory-management,fortran,destructor,Memory Management,Fortran,Destructor,以我的名义,它说 如果要最终确定的实体是一个数组,则该数组的每个元素的每个可最终确定的组件都将分别最终确定 而且也没有必要说elemental 但是如果我有一个可终结组件的向量,那么如果final过程没有声明为elemental,就会出现内存泄漏。(内存泄漏由valgrind报告) 是的,我使用ifort也有类似的漏洞,这就是为什么我不再使用finalno more…来提供一个涵盖标量和数组的最终子例程,那么它需要是基本的。如果不是元素而是标量虚拟,那么数组对象就没有最终的子例程。我将尝试查找我

以我的名义,它说

如果要最终确定的实体是一个数组,则该数组的每个元素的每个可最终确定的组件都将分别最终确定

而且也没有必要说
elemental

但是如果我有一个可终结组件的向量,那么如果
final
过程没有声明为elemental,就会出现内存泄漏。(内存泄漏由
valgrind
报告)


是的,我使用ifort也有类似的漏洞,这就是为什么我不再使用
final
no more…来提供一个涵盖标量和数组的最终子例程,那么它需要是基本的。如果不是元素而是标量虚拟,那么数组对象就没有最终的子例程。我将尝试查找我的旧示例,其中
final
被破坏。我想它多次调用了这个例程。。。这绝对是马车,要小心@弗朗西斯卡库斯说得通。但是ifort文档是错误的(或者至少是误导性的),我认为ifort文档是正确的,如果没有帮助的话。也就是说,所发生的事情是正确的,因为它引用了Fortran标准,但它没有解释这意味着什么。这使得您在这里提出的问题是合理的(如果没有其他问题,我会回答),但我要说的是,与适当的指南相比,ifort(大多数编译器)文档是学习如何使用Fortran语言的一种非常糟糕的方法。(很抱歉回复得太晚:你的@拼写有误。)是的,我使用ifort时也有类似的漏洞,这就是为什么我不再使用
final
no more…来提供一个包含标量和数组的最终子例程,那么它需要是基本的。如果不是元素而是标量虚拟,那么数组对象就没有最终的子例程。我将尝试查找我的旧示例,其中
final
被破坏。我想它多次调用了这个例程。。。这绝对是马车,要小心@弗朗西斯卡库斯说得通。但是ifort文档是错误的(或者至少是误导性的),我认为ifort文档是正确的,如果没有帮助的话。也就是说,所发生的事情是正确的,因为它引用了Fortran标准,但它没有解释这意味着什么。这使得您在这里提出的问题是合理的(如果没有其他问题,我会回答),但我要说的是,与适当的指南相比,ifort(大多数编译器)文档是学习如何使用Fortran语言的一种非常糟糕的方法。(很抱歉回复太晚:您的@拼写错误。)
module vector_mod
    implicit none(type, external)
    private
    public :: Vector_t

    type :: Vector_t
        real, pointer :: X(:) => null()
    contains
        procedure :: init
        final :: finalize
    end type

contains

    subroutine init(this, n, val)
        class(Vector_t), intent(out) :: this
        integer, intent(in) :: n
        real, intent(in) :: val
        allocate(this%X(n), source=val)
    end subroutine

    ! If this elemental is missing I get memory leaks in
    ! - gfortran 7.5.0
    ! - ifort 19.1.1.217
    elemental subroutine finalize(this)
        type(Vector_t), intent(inout) :: this
        if (associated(this%X)) deallocate(this%X)
    end subroutine

end module

program test_final_intentout
    use vector_mod, only: Vector_t
    implicit none(type, external)
    block
        type(Vector_t), allocatable :: vectors(:)
        integer :: i
        allocate(vectors(3))

        do i = 1, size(vectors)
            call vectors(i)%init(i, 1.)
        end do
    end block
end program