【发布时间】:2012-07-04 20:10:01
【问题描述】:
如果我遇到了问题,我目前遇到了问题
*** glibc detected *** ./efit: free(): invalid next size (fast): 0x00000000006127f0 ***
带有glibc 错误的常用内存映射和回溯信息。但是,我无法找到此问题的原因。似乎(基本上)我的整个程序在发生这种情况时已经完成。我在网上读到的一件事是,这可能是由于缺乏释放。
现在,我一直在运行程序而没有释放我的一些数组(我的印象是释放会导致内存泄漏,但这只会影响程序运行时的性能和效率)。现在,当我重新启动程序时,我遇到了这个错误。
我之前执行的程序没有释放我的数组是否有可能“回来困扰我”,因为我试图写入之前执行的内存有未释放的内存?
如果不是,我完全被这个错误弄糊涂了。关于我应该从哪里开始寻找和/或我应该如何调试以找到它的任何线索?
为了它的价值,我正在使用 gfortran 编译
编辑:
虽然编译选项一开始并没有直接识别出这个问题,但它帮助我减少了它。我在do 循环中将整数变量iat 用于iat=1,natoms,然后几行之后,我认为iat 在1,natoms 的范围内描述了一个不同的整数。我正在引用数组边界之外的数组。当我更正了您的编译选项列出的一些警告时,这个错误变成了更清晰的错误描述:Fortran runtime error: Index '7' of dimension 1 of array 'isnormed' above upper bound of 6。
是什么阻止了第一次产生这个错误?我所做的编译警告告诉我的唯一更改是更改 read(fout, '(a)'), line100' toread(fout, '(a)') line100' (删除逗号)并将旧样式字符描述 character*100 line100 更改为更新的 character(100) line100 描述.
【问题讨论】:
-
您描述的一些警告/错误是编译时警告。当您编译源代码时,编译器会识别它们。 “高于上限”错误是运行时错误——直到您运行程序才发生。这就是为什么它没有出现在第一组警告/错误中的原因。运行时检查不是默认设置,因为它们会消耗 CPU 时间,但在开发程序时非常有用。
-
我知道这一点,我的问题是在我进行这些编译时间更改之前,我遇到了运行时错误,但我从未收到“高于上限”错误 - 我只是得到了一个 @ 987654332@ 错误。我的问题是为什么进行这些简单的编译时警告更改会将
glibc detected错误变成“高于上限”错误。 -
我无法解释,除非你一开始没有 -fcheck=all 选项。
-
好吧,我没有,但正如你所说,所有这些选项都是编译时检查。它们都不是运行时错误检查选项,对吗?奇怪的是,在我更改了它给我的简单警告后,我得到了“高于上限”错误而不是
glibc。正如我告诉我妻子的那样……就好像我在墙上画了一道划痕,它以某种方式神奇地固定了门!
标签: memory-leaks fortran glibc memory-management