清宵逝水 发表于 2019-4-27 14:40:16

返回值的动态分配问题

大家好,请教两个问题
1.请问function里手动设置动态分配数组,调用结束时,这块内存也会被自动释放吗?
如果不会的话。那我将function的返回值设置为allocatable,要怎么手动释放呢(释放了就返回不了了啊),例如下面
function anomaly_1d(x) result(result)
          implicit none
          real, intent(in) :: x(:)
          real, allocatable :: result(:)
          integer :: n
          n = size(x)
          allocate(result(n))
          result = x-mean(x)
        end function anomaly_1d

2. 如果若干函数都调用了函数A,一旦A的名称要改变,岂不是要逐个修改?我现在是把函数都写在module里,然后用重载换成其他的名称。有没有什么好的方法解决,比如有没有指针那样的设置别名方法?

清宵逝水 发表于 2019-4-27 14:49:21

重载好像也不行,会提示GENERIC procedure ‘anomaly’ is not allowed as an actual argument

liudy02 发表于 2019-4-27 15:01:23

第一个问题,子进程里的用动态数组分配的内存你不必担心,不会造成内存泄漏的,不需要你手动去释放。实际的机制应该是除了输入和输出的数组,其他的数组都在调用结束释放了。容易造成内存泄漏的都是指针,虽然动态数组基本都是用指针实现的,但是在Fortran里这个的内存管理比指针好

第二个问题,你说的办法就是标准的办法啊,通过重载之后可以通过通用名调用,原名完全可以用private之类的标识符让它不能在其他地方被调用。至于函数指针当然是有的,但是Fortran的函数指针是类型强关联的。就是函数指针有类型,由它的输入输出接口决定函数指针的类型,一个函数指针只能指向和它的输入输出接口完全一致的函数,这个东西感觉比较没啥意思。如果你只是想用它给函数指定别名,倒是完全没有问题

清宵逝水 发表于 2019-4-27 18:41:41

liudy02 发表于 2019-4-27 15:01
第一个问题,子进程里的用动态数组分配的内存你不必担心,不会造成内存泄漏的,不需要你手动去释放。实际的 ...

谢谢解答~
页: [1]
查看完整版本: 返回值的动态分配问题