【发布时间】:2016-11-15 21:16:59
【问题描述】:
我正在使用包含一些数组指针的 fortran 代码;根据用户输入,它们可能被设置为使用赋值语句=> 指向另一个数组,或者它们可能直接使用allocate 语句进行分配。
这会在代码末尾产生释放内存的问题,因为在第一种情况下我只想nullify 指针,而在第二种情况下我需要deallocate 它以防止内存泄漏。问题是associated 在这两种情况下都返回true,所以我不知道如何在不手动跟踪的情况下判断我所处的情况。由于有很多这样的数组指针,我宁愿避免这样做。
有没有简单的方法来区分这两种情况?
谢谢!
【问题讨论】:
-
“在代码的末尾”,你的意思是有多接近结尾?在整个执行过程中,我可能会关心内存泄漏等问题,但在我的程序结束时,确保一切都被整理好不再是我的责任。
-
我不确定我是否理解你的意思......当然我应该瞄准在程序终止之前分配的所有内存?
-
我的意思是,考虑一下(可怕的)程序:
allocatable i; allocate(i); end。对于没有deallocate,我一点也不感到内疚。有时我想负责解除分配,但不是在这里。您的问题的前提是应该有deallocate声明吗?我的第一条评论就是为了证明这一点。 -
啊抱歉,是的,我感到内疚!每个
allocate都应该有一个deallocate。如果我这样做:integer, pointer :: i(:); allocate i(5); nullify(i); end那么我最终会得到一些空间,这些空间没有被释放并且代码也无法访问。 -
为了清楚起见,以免其他人偶然发现这个问题并像我一样感到困惑——绝对没有必要显式释放内存,无论是在最后使用
deallocate还是nullify的一个程序。除非您的操作系统损坏,否则它将在程序结束时获得分配给程序的所有内存。如果 OP 关心的是在执行期间的另一点获取内存,那将是另一回事。值得牢记的是,最新版本的 Fortran 标准保证在分配的对象超出范围时释放。
标签: arrays pointers memory-leaks fortran fortran90