下面一段代码中,我们在模块m_dat中定义了一个包含动态数组的结构体dat,结构体dat具有方法load,用于分配内存以及初始化变量。主程序中两次调用load方法,对结构体中动态数组进行内存分配和赋值,并输出结果。
module m_dat
type dat
real,allocatable::a(:)
contains
procedure,pass:: load
end type
contains
integer function load(obj)
class(dat),intent(inout):: obj
integer::k=0
k=k+1
allocate(obj.a(k))
obj.a=k
load=0
end function
end module
program y
use m_dat
type(dat) d
integer i
i=d.load()
print*,d.a(1)
pause
i=d.load()
print*,d.a(1)
pause
end
运行时出现如下错误,是因为我们两次对同一动态数组分配内存。
我们对代码中的load方法作一些修改。先检测数组是否已分配,如果已分配内存,则将其释放掉,然后再分配。修改后代码如下:
integer function load(obj) class(dat),intent(inout):: obj integer::k=0 k=k+1 if(allocated(obj.a)) deallocate(obj.a) allocate(obj.a(k)) obj.a=k load=0 end function
代码修改后,程序便能正确执行,结果如下图。

基于本文的主旨,我们讨论另一种情况。修改load方法的代码:
可以看出,相对于文章开头的代码,我们只是将形参obj的intent属性由inout改为了out,而并未添加检测数组是否已分配的操作。程序能够正确执行,运行结果与上图一致。
integer function load(obj) class(dat),intent(out):: obj integer::k=0 k=k+1 allocate(obj.a(k)) obj.a=k load=0 end function
结论:如果函数中形参obj为包含动态数组的结构体变量,执行该函数时,如果obj具有intent(inout)属性(缺省), 对应的实参会被原样传递给obj;如果具有intent(out)属性,那么在,将首先释放结构体变量中动态数组所占用的内存空间。



