2

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

*** glibc detected *** ./efit: free(): invalid next size (fast): 0x00000000006127f0 ***

glibc带有通常的内存映射和错误附带的回溯信息。但是,我无法找到此问题的原因。似乎(基本上)我的整个程序在发生这种情况时已经完成。我在网上读到的一件事是,这可能是由于缺乏释放。

现在,我一直在运行程序而没有释放我的一些数组(我的印象是释放会导致内存泄漏,但这只会影响程序运行时的性能和效率)。现在,当我重新启动程序时,我遇到了这个错误。

是否有可能我之前执行的程序没有释放我的数组是“回来困扰我”,因为我试图写入的之前的执行中有未释放的内存?

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

对于它的价值,我正在使用 gfortran 编译

编辑:虽然编译选项一开始并没有直接识别出这个问题,但它帮助我减少了它。我在循环中使用了一个整数变量iat,然后几行之后,我认为是在. 我正在引用数组边界之外的数组。当我更正了您的编译选项列出的一些警告时,这个错误变成了对错误更清晰的描述:.iat=1,natomsdoiat1,natomsFortran 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描述。

4

2 回答 2

1

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

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

损坏的堆意味着您的程序生成的答案可能从完全正确到完全无用。你必须摆脱这个消息。

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

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

最好的方法是使用valgrind旨在详细检测和报告堆问题的工具。

于 2012-07-04T20:25:11.580 回答
1

上一次运行程序的错误不会影响下一次运行。操作系统加载可执行文件的新版本并为其提供内存。只有当您让程序将信息写入文件并在下次运行时将其读入时,它们才能传输信息。

当程序完成时,操作系统会自动释放内存。此外,对于 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 -迂腐的-fbacktrace。如果其中一些识别出过多的警告,那么对于这个问题来说重要的是 fcheck=all,或者更窄的 fcheck=bounds。

于 2012-07-04T20:36:23.940 回答