我正在使用gfortran -std = f2008。我有一个函数返回包含可分配数组的派生类型。该函数在返回之前调用allocate()。似乎数组在分配数组的函数返回后的某个时间被自动释放,并且我的程序会出现段错误。
何时发生自动释放?我应该以不同的方式对此进行编码吗?
答案 0 :(得分:15)
一个普遍的答案:当超出范围时,可分配的数组会自动释放。在外部作用域中“使用”结果后,将自动释放函数结果。当父派生类型变量超出范围或取消分配时,可释放分配可分配组件。
仅指向函数结果的pointers
在取消分配后未定义,不得使用。如果你这样做,可能会导致你描述的问题。
此外,当一个数组在赋值时自动重新分配时,指向它的指针变为未定义(但实际上可能不会改变)。
换句话说,当正确使用allocatable时,不应出现您描述的问题。
答案 1 :(得分:3)
另一个一般建议:大多数时候,使用子程序而不是函数来返回复杂的结果比如数组,指针,带有可分配内部的派生类型更安全...
其他问题:你在表达式中使用你的函数吗?如果没有那么它应该是一个子程序。只有在计算表达式中使用Fortran函数才有兴趣。