Memory Fortran开发人员可以做的所有可能的内存错误是什么?
对于C/C++,我对可能导致内存泄漏、内存损坏等的用例有很好的了解。。。Memory Fortran开发人员可以做的所有可能的内存错误是什么?,memory,fortran,Memory,Fortran,对于C/C++,我对可能导致内存泄漏、内存损坏等的用例有很好的了解。。。 但是Fortran呢?我想说,指针分配绝对是Fortran中造成内存泄漏的一种方式(可能是唯一明显的方式): program test implicit none integer :: ii integer, pointer :: leak(:) do ii = 1, 10000000 allocate(leak(1000)) leak(:) = 0 end do end prog
但是Fortran呢?我想说,指针分配绝对是Fortran中造成内存泄漏的一种方式(可能是唯一明显的方式):
program test
implicit none
integer :: ii
integer, pointer :: leak(:)
do ii = 1, 10000000
allocate(leak(1000))
leak(:) = 0
end do
end program test
正如另一个答案所述,指针可能导致内存泄漏 有两种明显的方式会导致内存损坏。您可以写入不存在的数组元素:
real :: a (100)
a (101) = 3.0
您也可以在调用中的参数与实际子例程中的参数不匹配的情况下调用子例程。有很多方法可以做到这一点
内存损坏可能很严重,因为症状可能在错误发生后很长一段时间内变得可见,或者因为它会导致非信息性错误(例如,“分段错误”)。使用现代Fortran、正确的编码和编译器提供的完整错误检查选项,Fortran编译器将检测我提到的两种方法,并提供信息性消息。运行时下标检查将检测对数组中不存在的元素的写入。如果将接口显式化为子例程,编译器将在编译时检测调用和过程中参数之间的不匹配。最简单的方法是将程序(子程序和函数)放入模块并使用这些模块。当然,但在这种情况下,编译器会抛出一个警告,请您在继续之前修复该错误。在Stackoverflow上有很多问题,程序员没有使用现代Fortran的这些功能,也无法诊断编译器可以轻松找到的程序。