Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory leaks 如何在Fortran 2003程序中找到内存泄漏的原因?_Memory Leaks_Fortran_Fortran90_Memory Leak Detector - Fatal编程技术网

Memory leaks 如何在Fortran 2003程序中找到内存泄漏的原因?

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消息缓冲区,消息 我猜这与我的程序内存泄漏有关 如何找出泄漏发生的位置以及如何修复?这与其说是一个答案,不如说是一个扩展的评论 您已经猜到内存泄漏,但您没有提供任何信息,我们可以帮助您将猜测转化为诊断。在缺乏此类

我有一个用Fotran 2003编写的Fortran程序,并用

英特尔(R)Fortran编译器XE,适用于在IA-32上运行的应用程序,版本12.1.2.273 Build 20111128

在长时间运行我的程序(这是一个物理计算)后,我读出:
内存不足,无法分配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