char(:), allocatable ::类型字符变量释放方法及释放后长度异常解析
为什么Fortran可分配字符变量释放后长度仍显示5?
嘿,这个问题其实戳中了Fortran标准里关于可分配变量状态的一个关键点,咱们慢慢说清楚:
问题根源:未定义行为
你看到deallocate之后len(glo_isp_gre)还返回5,并不是释放操作没生效,而是此时调用len()属于未定义行为。
按照Fortran的规范,当一个可分配变量被释放后,它的存储空间已经归还给系统,变量本身处于“未分配”状态。这时候去访问它的任何属性(包括长度、值),编译器可以返回任意结果——Intel Fortran在这里只是保留了之前内存里的残留值,所以返回了5,但这个结果完全不可靠,换个编译器或者编译选项,可能就会返回0、随机数,甚至直接崩溃。
正确的释放与状态判断方法
你的deallocate(glo_isp_gre)写法本身是完全正确的,错误出在释放后还去调用len()。想要确认变量是否成功释放,应该用allocated()函数:
program test implicit none character(:), allocatable :: glo_isp_gre character(*), parameter :: glo_isp_aaa = "abcd!" allocate( character( len(glo_isp_aaa) ) :: glo_isp_gre) glo_isp_gre = glo_isp_aaa print *, len(glo_isp_gre), len(glo_isp_aaa) ! 正常输出5 5 deallocate( glo_isp_gre) print *, allocated(glo_isp_gre) ! 输出.FALSE.,说明已成功释放 ! 注意:此时绝对不能再调用len(glo_isp_gre)或直接赋值给它 end program test
如果之后需要重新使用这个变量,必须再次调用allocate为它分配存储空间,否则直接操作未分配的变量同样是未定义行为。
内容的提问来源于stack exchange,提问作者Harry Kastorp
相关产品推荐
相关产品推荐

