主题:疯了!Read内部文件时部分机器出错~~~~
cgl_lgs
[专家分:21040] 发布于 2009-09-28 15:46:00
不知道大家遇见没遇见这样的问题:
前提:
1、输入文件相同
2、程序相同
3、机器配置相同
4、LineBuffer行缓冲有512个字节,里面有1个INTEGER,[b][color=FF0000]8[/color][/b]个REAL*8
问题:
1、部分机器运行时崩溃,根据崩溃点返回的调用栈信息找到是运行到“READ(LineBuffer,*,[color=FF0000]IOSTAT=IISOK[/color])R,X(1:6),XX(1:4)”时,访问未定义内存了!
2、直接调试程序(不用源码,直接调试EXE)时,死活没事儿~~~~
3、在不出错的机器上,修改一点点输入数据(这些数据并不影响动态数组的大小)有可能也挂,在必然挂的机器上运行前改改这个输入数据也有可能没事儿。
4、用DEBUG版本程序、静态分析源码——程序并无数组越界的问题!
5、将动态数组全改为静态数组,数组大小为正好容下易出错数据的情况,程序依然正常~~~~
6、把LineBuffer里面数据个数改为1个INTEGER,[b][color=FF0000]10[/color][/b]个REAL*8,程序在所有机器上运行正常!
7、再次分析汇编代码,发现READ访问了从LineBuffer第一个数据到第[b][color=FF0000]513[/color][/b]个数据!一般情况那儿会有数据,但如果后面没有效空间,那程序就真挂了!
难道这是编译器生成代码的BUG?
真疯了~~~~~
最后更新于:2009-09-28 15:48:00
回复列表 (共9个回复)
沙发
helo_aBiNg [专家分:480] 发布于 2009-09-28 16:36:00
Storage allocated, but no longer accessible, cannot be released or used elsewhere in the program and is said to be in an `undefined' state.
This reduction in the total storage available to the program called is a `memory leak'.
不明真相,hope it helps.:D
板凳
cgl_lgs [专家分:21040] 发布于 2009-09-28 17:14:00
谢谢,但个人认为FORTRAN想写出内存泄漏的程序还真难。
如果你Allocate了没释放,在程序执行完后系统会自动回收。
如果你Allocate了再重复Allocate,那程序直接就崩溃了——而不是泄漏:)
另:程序的问题很明显不是泄漏导致的:)
是access violation:)
3 楼
jason388 [专家分:6150] 发布于 2009-09-28 17:15:00
fortran2003标准关于内部文件定义说明的第一条如下:
1.The file is a variable of default, ASCII, or ISO 10646 character type that is not an array section with a vector subscript.
不知你程序中是否在内部文件中存储了数组section?
4 楼
cgl_lgs [专家分:21040] 发布于 2009-09-28 17:20:00
谢谢楼上,也没有。
LineBuffer的定义是:
Character LineBuffer*512
当前内容只有数字,为1个INTEGER与8个REAL,中间用空格隔开的:)
5 楼
cgl_lgs [专家分:21040] 发布于 2011-06-26 23:02:00
最终自己找到了“答案”:
1、确实是编译器BUG。
2、解决方案是利用了:段页式管理时,内存分配是按块(PARA)为单位的,所以只要不是16字节的整数倍,后面就会有“节余”,自然越界也不会出错。
6 楼
dongyuanxun [专家分:7180] 发布于 2011-06-26 23:18:00
这是神马?
7 楼
cgl_lgs [专家分:21040] 发布于 2011-06-26 23:35:00
是我当初还用CVF时发现的一件让我纠结了很久时间的问题:)
8 楼
dongyuanxun [专家分:7180] 发布于 2011-06-26 23:51:00
原来是这里啊,我还在想,谁闲着无聊给我加了10分
9 楼
cgl_lgs [专家分:21040] 发布于 2011-06-27 00:36:00
那我接着无聊吧:)
我来回复