Memory leaks 如何在Fortran 2003程序中找到内存泄漏的原因?
我有一个用Fotran 2003编写的Fortran程序,并用 英特尔(R)Fortran编译器XE,适用于在IA-32上运行的应用程序,版本12.1.2.273 Build 20111128 在长时间运行我的程序(这是一个物理计算)后,我读出:Memory leaks 如何在Fortran 2003程序中找到内存泄漏的原因?,memory-leaks,fortran,fortran90,memory-leak-detector,Memory Leaks,Fortran,Fortran90,Memory Leak Detector,我有一个用Fotran 2003编写的Fortran程序,并用 英特尔(R)Fortran编译器XE,适用于在IA-32上运行的应用程序,版本12.1.2.273 Build 20111128 在长时间运行我的程序(这是一个物理计算)后,我读出: 内存不足,无法分配Fortran RTL消息缓冲区,消息 我猜这与我的程序内存泄漏有关 如何找出泄漏发生的位置以及如何修复?这与其说是一个答案,不如说是一个扩展的评论 您已经猜到内存泄漏,但您没有提供任何信息,我们可以帮助您将猜测转化为诊断。在缺乏此类
内存不足,无法分配Fortran RTL消息缓冲区,消息 我猜这与我的程序内存泄漏有关
如何找出泄漏发生的位置以及如何修复?这与其说是一个答案,不如说是一个扩展的评论 您已经猜到内存泄漏,但您没有提供任何信息,我们可以帮助您将猜测转化为诊断。在缺乏此类信息的情况下,一些建议 a) Fortran程序内存泄漏的发生方式与其他程序相同:程序员在完成时忘记(或忽略)释放变量;不要忘记,使用Fortran 2003,您可以拥有可分配的标量 b) 在长时间运行的科学计算中,经常会发现大量的输出以迭代的方式建立起来,有时在计算过程中将这些输出写入磁盘比等到结束要好;您在I/O(好吧,主要是O)时间上受到了影响,但确实节省了内存使用 c) 有多种工具可帮助您发现内存泄漏,包括Intel Inspector和各种开源程序 d) 您应该非常清楚程序运行时所需的内存是如何变化的
e) 有时,在这个领域,答案只是购买更多的RAM。这更多的是一个扩展评论,而不是答案 您已经猜到内存泄漏,但您没有提供任何信息,我们可以帮助您将猜测转化为诊断。在缺乏此类信息的情况下,一些建议 a) Fortran程序内存泄漏的发生方式与其他程序相同:程序员在完成时忘记(或忽略)释放变量;不要忘记,使用Fortran 2003,您可以拥有可分配的标量 b) 在长时间运行的科学计算中,经常会发现大量的输出以迭代的方式建立起来,有时在计算过程中将这些输出写入磁盘比等到结束要好;您在I/O(好吧,主要是O)时间上受到了影响,但确实节省了内存使用 c) 有多种工具可帮助您发现内存泄漏,包括Intel Inspector和各种开源程序 d) 您应该非常清楚程序运行时所需的内存是如何变化的
e) 有时,在这个领域,答案只是购买更多的RAM。正如第一个答案所表明的,你的问题非常笼统,不太适合具体的答案。你在用指针吗?指针不如可分配的安全——如果它们愿意做这项工作,就切换到可分配的
关于ifort调试选项的建议:
-O2-支架f03-假设realloc\u lhs-检查所有-回溯-警告所有-fstack protector-假设protect\u parens-隐式无
正如第一个答案所示,您的问题非常笼统,不适合特定的答案。你在用指针吗?指针不如可分配的安全——如果它们愿意做这项工作,就切换到可分配的
关于ifort调试选项的建议:
-O2-stand f03-假设realloc\u lhs-检查所有-回溯-警告所有-fstack protector-假设protect\u parens-隐式
我想您已经从编译器那里得到了答案:内存不足。在程序的某个点上,您试图分配一个大内存
您可以使用“-O0-debug-traceback-check-ftrapuv”标志编译程序,然后再次运行它。您可以使用“英特尔调试器”逐行检查程序(我的意思是您认为问题可能在哪里)。幸运的是,你不需要使用其他工具,比如valgrind
有时,使用Gfortran编译也会有所帮助。请注意,您需要使用不同的编译器选项来检查数组边界
最后一个技巧是关于使用“关联”构造。我个人使用它有很多问题。如果您使用它,请将其从代码中删除并再次检查。我想您已经从编译器那里得到了答案:内存不足。在程序的某个点上,您试图分配一个大内存 您可以使用“-O0-debug-traceback-check-ftrapuv”标志编译程序,然后再次运行它。您可以使用“英特尔调试器”逐行检查程序(我的意思是您认为问题可能在哪里)。幸运的是,你不需要使用其他工具,比如valgrind 有时,使用Gfortran编译也会有所帮助。请注意,您需要使用不同的编译器选项来检查数组边界
最后一个技巧是关于使用“关联”构造。我个人使用它有很多问题。如果你使用它,将其从代码中删除,然后再次检查。这是一个大型程序,我想了解更多有关诊断问题的方法。如果您需要工具而不是尝试valgrind,可能需要某种mem调试器。这是一个大型程序,我想了解更多有关诊断问题的方法。如果您需要工具,可能需要某种mem调试器工具,而不是尝试valgrind。如果我使用指针并将其重新指向另一个对象,我应该在重新绘制后释放孤立对象,对吗?当不再需要对象时,应该释放该对象。你需要这样做,而你仍然有一个有效的方式来引用它。如果您的唯一方法是通过一个指针,并且您重新分配了指针,那么您已经泄漏了内存。可分配变量很难出现泄漏,因为与指针不同,它们在许多情况下是自动释放的。F