Fortran 递归类型的内部组件不会在内部赋值中复制

Fortran 递归类型的内部组件不会在内部赋值中复制,fortran,gfortran,Fortran,Gfortran,考虑以下Fortran程序: program test_prg implicit none type :: recursive_block type(recursive_block), allocatable :: subblocks(:, :) end type type(recursive_block) :: top_level top_level = init_recursive() print *, loc(top_level % subblocks(

考虑以下Fortran程序:

program test_prg
  implicit none

  type :: recursive_block
    type(recursive_block), allocatable :: subblocks(:, :)
  end type

  type(recursive_block) :: top_level
  top_level = init_recursive()
  print *, loc(top_level % subblocks(1, 1) % subblocks)
  deallocate(top_level % subblocks)

contains

  function init_recursive() result(res)
    type(recursive_block) :: res
    type(recursive_block), allocatable :: inner(:, :)

    allocate(inner(1, 1))
    allocate(inner(1, 1) % subblocks(1, 1))
    print *, loc(inner(1, 1) % subblocks)
    res % subblocks = inner
  end function
end program
使用gfortran 10.2编译,此代码在解除分配(顶层%子块)时崩溃,并显示以下消息:

free(): double free detected in tcache 2
我怀疑这可能与以下事实有关:
top_level%子块(1,1)%subblocks
的地址与
internal(1,1)%subblocks
的地址匹配,后者是局部变量的一个组成部分,应该在退出函数时解除分配


这是gfortran bug吗?

如果不使用
内部
并且在下一行自动释放,这有关系吗?你有没有一个很重要的例子?这似乎是一个很好的优化。@VladimirF局部变量将在过程退出时释放,因此此地址在调用代码中无效。我已经扩展了这个例子来展示它。直到现在我才意识到你有一个递归的可分配类型。这些都是Fortran 2008中的新版本,测试肯定要少得多(请参阅)。那里可能有虫子。我没有得到任何崩溃,但我确实从valgrind得到了一些无效的读取。如果不使用
internal
并在下一行自动释放,这有什么关系吗?你有没有一个很重要的例子?这似乎是一个很好的优化。@VladimirF局部变量将在过程退出时释放,因此此地址在调用代码中无效。我已经扩展了这个例子来展示它。直到现在我才意识到你有一个递归的可分配类型。这些都是Fortran 2008中的新版本,测试肯定要少得多(请参阅)。那里可能有虫子。我没有受到任何碰撞,但我确实从valgrind那里得到了一些无效的读数。