为什么对不相关的整数变量进行调用会在Fortran中释放无限的多态指针?

问题描述 投票:0回答:1

我试图将任何类型的值保存在无限多态类指针中,然后使用将返回值作为特定类型的函数来检索该值。到目前为止,我只为整数编写了代码。

文件名:pointers.f90

module pointers_example
contains
  subroutine assign_int(pt,val)
    class(*),allocatable,target :: temp
    class(*),pointer,intent(inout) :: pt
    integer,intent(in) :: val

    allocate(temp,source=val)
    pt => temp

  end subroutine assign_int

  pure function int_val(pt) result (val)
    class(*),intent(in) :: pt
    integer :: val

    select type(v => pt)
    type is (integer)
       val = v
    end select
    return
  end function int_val

end module pointers_example

program main
  use pointers_example
  implicit none
  class(*),pointer :: pt
  integer :: i = 10
  integer :: output_unit = 6


  call assign_int(pt,10)
  write(output_unit,'("1. int_val(pt) = ",I2)') int_val(pt)
  write(output_unit,'("i == int_val(pt)? ",L1)') int_val(pt) == i
  write(output_unit,'("i = ",I2)') i
  write(output_unit,'("2. int_val(pt) = ",I2)') int_val(pt)
  write(output_unit,'("i == int_val(pt)? ",L1)') int_val(pt) == i
  call assign_int(pt,10)
  write(output_unit,'("3. int_val(pt) = ",I2)') int_val(pt)

end program main

[当我使用gfortran进行编译并运行代码时,我得到了:

$ gfortran -o pointers pointers.f90 ; ./pointers
1. int_val(pt) = 10
i == int_val(pt)? T
i = 10
2. int_val(pt) = **
i == int_val(pt)? F
3. int_val(pt) =  0

在第二种情况下,我不希望int_val(pt)== **。比较int_val(i)==我似乎暗示它们都是在调用write(output_unit,'(“ i =”,I2)')i之前具有相同值的整数,但它们不是之后一样。似乎还不知道在打印到控制台之外进行写操作还有其他副作用。谁能解释这种行为?

pointers fortran polymorphism gfortran
1个回答
0
投票

感谢@evets的回应,我找到了解决方案。我已将旧代码留在注释中:

subroutine assign_int(pt,val)
    !class(*),allocatable,target :: temp
    class(*),pointer,intent(inout) :: pt
    integer,target,intent(in) :: val

    ! allocate(pt,source=val)
    ! pt => temp
    pt => val
end subroutine assign_int

基本上,临时(temp)指针已被释放,因为它尚未保存并且未被assign_int函数返回。根据Fortran标准“ 19.5.2.5:当...(3)指针的目标不是通过指针释放时,指针的关联状态变为未定义”,则pt目标未定义。

© www.soinside.com 2019 - 2024. All rights reserved.