Memory leaks 缺少解除分配会导致什么样的问题?

Memory leaks 缺少解除分配会导致什么样的问题?,memory-leaks,fortran,glibc,memory-management,Memory Leaks,Fortran,Glibc,Memory Management,我目前遇到一个问题,如果我 ***glibc检测到***./efit:free():无效的下一个大小(fast):0x00000000006127f0*** 使用glibc错误附带的常规内存映射和回溯信息。然而,我无法找到这个问题的原因。看起来(基本上)我的整个计划在这发生的时候已经完成了。我在网上读到的一件事是,这可能是由于缺乏解除分配 现在,我一直在运行这个程序,但没有取消分配我的几个阵列(我的印象是,取消分配可能会导致内存泄漏,但这只会影响程序运行时的性能和效率)。现在,当我重新启动程序时

我目前遇到一个问题,如果我

***glibc检测到***./efit:free():无效的下一个大小(fast):0x00000000006127f0***

使用
glibc
错误附带的常规内存映射和回溯信息。然而,我无法找到这个问题的原因。看起来(基本上)我的整个计划在这发生的时候已经完成了。我在网上读到的一件事是,这可能是由于缺乏解除分配

现在,我一直在运行这个程序,但没有取消分配我的几个阵列(我的印象是,取消分配可能会导致内存泄漏,但这只会影响程序运行时的性能和效率)。现在,当我重新启动程序时,我遇到了这个错误

我以前在没有释放数组的情况下执行的程序是否有可能“再次困扰我”,因为我试图写入以前执行的程序中有未释放的内存

如果不是,我完全被这个错误弄糊涂了。关于我应该从哪里开始寻找和/或如何调试以找到它的任何线索

不管它值多少钱,我都在使用gfortran来编译

编辑: 虽然编译选项起初并没有直接识别这个问题,但它帮助我消除了这个问题。我在
do
循环中为
iat=1,natoms
使用了一个整数变量
iat
,几行之后,我认为
iat
1,natoms
的范围内描述了一个不同的整数。我引用了数组边界之外的数组。当我更正了编译选项列出的一些警告时,这个错误变成了对错误更清晰的描述:
Fortran运行时错误:数组“isnormed”的维度1的索引“7”高于上限6


是什么阻止了第一次产生这个错误?编译警告告诉我的唯一reach更改是将
read(fout,,(a)”、line100'更改为
read(fout,,(a)“line100”(删除逗号)以及将旧式字符描述
character*100 line100
更改为较新的
字符(100)line100
说明。

此消息与取消分配失败无关。它说堆已经损坏了。出现这种情况的方法有很多,但忘记释放数组不是其中之一。如果这是Fortran代码,则可能是错误声明的数组

glibc
执行一致性检查时,将生成该消息。因此,消息发生的时间(运行的开始或结束)与此无关,除非您知道损坏发生在消息出现之前的某个时间(但可能是任何时间)

损坏的堆意味着程序生成的答案可能是完全正确的,也可能是完全无用的。你得把这条消息处理掉

(我的印象是释放会导致内存泄漏,但这只会影响程序运行时的性能和效率

这是向后的。未完成释放时会发生内存泄漏


最好的方法是使用像
valgrind
这样的工具来详细检测和报告堆问题。

程序上一次运行的错误不会影响下一次运行。操作系统将加载新版本的可执行文件并为其提供内存。仅当您将程序写入文件并在操作系统中读取时n下一次运行可以是信息传输

当程序完成时,操作系统会自动释放内存。此外,对于Fortran>=95,当程序返回时,Fortran会自动释放程序本地的可分配数组

很可能是内存使用问题损坏了描述程序所用内存的内部结构。使用Fortran时,调用方和被调用方之间的参数不匹配、索引超出数组末尾或使用指针,都可能导致内存使用问题。是否使用指针?如果不是,前两个通常是在这个时代很容易防范。将您的过程放入模块中并“使用”这些模块。这将允许编译器检查参数一致性。使用用于运行时检查下标的选项进行编译。这将发现您是否正在索引数组末尾并存储在其他内存中


使用gfortran,尝试以下编译器选项:-O2-fimplicit none-Wall-Wline truncation-Wcharacter truncation-Wsurprising-Waliasing-Wimplicit interface-Wunused parameter-fwhole file-fcheck=all-std=f2008-pedantic-fbacktrace。如果其中一些选项识别了太多警告,则此问题的重要选项是fcheck=all、 或者更窄一些,fcheck=bounds。

谢谢,这就是我的意思——缺少释放可能会导致内存泄漏。值得一提的是,内存泄漏只会影响正在运行的程序,一旦程序终止,它就不再是问题了吗?内存泄漏就是它听起来的样子。机器有固定的内存量。如果你如果发生泄漏,O/S和运行时系统会认为在您实际上不使用内存块的情况下分配内存块。这意味着您的程序正在消耗它不需要的内存资源。结果可能是良性的(在现代工作站上使用20K而不是10K字节将完全不被注意)或灾难(在4Gb计算机上使用8Gb而不是2Gb)。您描述的一些警告/错误是编译时警告。它们由编译器在编译源代码时识别。“上述上限”错误是一个运行时错误——在运行程序之前它不会发生。这就是为什么它不会出现在第一组警告/错误中。运行时检查不是默认的,因为它们