在 Fortran 中返回可变长度字符串的建议解决方案来自this问题:
function itoa(i) result(res)
character(:),allocatable :: res
integer,intent(in) :: i
character(range(i)+2) :: tmp
write(tmp,'(i0)') i
res = trim(tmp)
end function
我的理解是否正确,该函数的结果永远不会被释放?因此,对于大量的调用,您可能会遇到内存泄漏。
所以我的意思是,我不分配函数的结果,而是“就地”使用它,如下所示
do i = 1, n
write(*, *) "tmp_"//itoa(i)
end do
我显然没有参考我可以调用的结果deallocate
当我循环时,它绝对不会超出范围。
如果我正确理解你(@Francescalus),我仍然可以相信它已被释放的事实。
这个问题是一个具体案例另一个,但具体化可以让我们更加精确。您应该阅读那里的答案以获取更多一般细节。
正确的实现中不会出现内存泄漏。 Fortran 标准明确地解决了这些结果。例如,在 Fortran 2008 中,注释 12.41 表示:
函数结果类似于函数子程序本地的任何其他实体(变量或过程指针)。它的存在从函数执行开始时开始,到函数执行终止时结束。然而,由于该实体的最终值随后用于调用该函数的表达式的求值,因此实现可能希望推迟释放该实体占用的存储空间,直到其值已用于表达式求值之后。
当可分配函数结果的存在结束时,它将被释放。所有可分配结果都会发生这种情况,而不仅仅是延迟长度字符串。
因此,内存可能会“泄漏”一段时间,但应该很快就会被回收。许多级别的函数评估可能会导致问题 - 但在此之前您可能已经得到了令人讨厌的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)