下面一段代码中,我们在模块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)属性,那么在,将首先释放结构体变量中动态数组所占用的内存空间。