回 帖 发 新 帖 刷新版面

主题:疯了!Read内部文件时部分机器出错~~~~

不知道大家遇见没遇见这样的问题:
前提:
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?
真疯了~~~~~

回复列表 (共9个回复)

沙发

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

板凳

谢谢,但个人认为FORTRAN想写出内存泄漏的程序还真难。
如果你Allocate了没释放,在程序执行完后系统会自动回收。
如果你Allocate了再重复Allocate,那程序直接就崩溃了——而不是泄漏:)

另:程序的问题很明显不是泄漏导致的:)
是access violation:)

3 楼

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 楼

谢谢楼上,也没有。
LineBuffer的定义是:
Character LineBuffer*512
当前内容只有数字,为1个INTEGER与8个REAL,中间用空格隔开的:)

5 楼

最终自己找到了“答案”:
1、确实是编译器BUG。
2、解决方案是利用了:段页式管理时,内存分配是按块(PARA)为单位的,所以只要不是16字节的整数倍,后面就会有“节余”,自然越界也不会出错。

6 楼

这是神马?

7 楼

是我当初还用CVF时发现的一件让我纠结了很久时间的问题:)

8 楼

原来是这里啊,我还在想,谁闲着无聊给我加了10分

9 楼

那我接着无聊吧:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册