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