我正在使用gfortran -std = f2008.我有一个函数返回包含可分配数组的派生类型.该函数在返回之前调用allocate().似乎数组在分配数组的函数返回后的某个时间被自动释放,并且我的程序会出现段错误.
什么时候自动释放?我应该以不同的方式编码吗?
假设我有类似的东西:
real, dimension(:), allocatable :: S
integer, dimension(:) :: idx
...
S = S(idx)
Run Code Online (Sandbox Code Playgroud)
whereS和idx在分配之前正确分配/初始化。
Fortran 标准对 的内存位置(地址)有S什么说法(如果有的话)?分配后它应该留在同一个地方吗?是否未指定(由编译器决定)?是否有所作为,如果S不是allocatable?
完整示例:
$ cat test.f90
program test
implicit none
real, dimension(:), allocatable :: S
integer :: i, idx(7) = [1,3,5,7,2,4,6]
allocate(S(size(idx)))
do i=1,size(S)
S(i) = i*i
end do
write(6,*) S
write(6,*) loc(S)
S = S(idx)
write(6,*) S
write(6,*) loc(S)
S(:) = S(idx)
write(6,*) S
write(6,*) loc(S)
deallocate(S)
end program
$ sunf90 -V
f90: …Run Code Online (Sandbox Code Playgroud)