刚才帮同学看了个程序,结构比较简单,一个计算函数,一个主函数。
编译无错,运行时,总是运行到第509次时就崩溃了。
简单看了下程序,主函数就是一个调用计算函数的循环,计算函数里面有若干次的文件读写操作和一次随机数生成调用,其他是大量的计算过程。
先扫了下代码,发现太乱,就先想看是不是随机数调用的问题,于是把随机数生成去掉运行,结果还是第509次运行出错,看来不是随机数的问题;接着把计算过程都注释掉运行,依然是第509次崩溃;最后目光集中到剩下的文件操作上,联想到509跟255的关系,猜测可能是文件句柄打开的数目达到了系统上限,虽然我自己从来没碰到过这种情况。
接着重点检查文件打开和关闭,果然,所有的文件打开关闭操作都有对应,唯独有一次没有关闭。于是 加上一条关闭语句,再运行,果然正常了,不再崩溃。
问题解决了,但为什么是509次呢?跟2的n次方没什么关系啊?想了下,可能是程序启动时系统默认打开了三个句柄的缘故,即标准输入文件stdin、标准输出文件stdout、标准错误输出文件stderr。
为了验证,搜索了一下,发现有一对可以获取和设置当前系统允许打开的最大句柄数的函数:_getmaxstdio()和_setmaxstdio()。不过这是windows的平台函数,其他系统平台有没有类似的函数没去深究。
写了个程序简单验证了一下,果然,当前系统允许的最大句柄数是512,512-3=509。
问题虽然不是很复杂,但进一步说明,一定要有良好的文件操作习惯。程序简单了还好,复杂了就难说了。