(search key: std::fstream句柄泄漏 std::fstream析构是否关闭句柄 )
蔡亮<errorcpp@qq.com> 12:49:19
std::fstream 析构的时候会关闭文件句柄么?
蔡亮<errorcpp@qq.com> 12:50:34
求stl高手指导,,,
我记得是会关闭的,,,
石刚(172106137) 12:51:35
ifstream?
石刚(172106137) 12:51:44
ifstream 会
蔡亮<errorcpp@qq.com> 12:52:35
哦,这我就放心了
石刚(172106137) 12:54:58
嗯,
石刚(172106137) 12:55:02
但要注意一点,
石刚(172106137) 12:55:15
ifstream只关闭你最后一次打开的文件。
蔡亮<errorcpp@qq.com> 12:56:36
也就是说复用 fstream的时候有可能应为忘记关闭句柄导致泄漏?
石刚(172106137) 12:56:57
会
蔡亮<errorcpp@qq.com> 12:57:04
嗯
石刚(172106137) 12:57:19
它只在析构时关闭,
蔡亮<errorcpp@qq.com> 12:57:41
妹的,以前没注意,,,
石刚(172106137) 12:57:40
如果你用同一个对象操作一个文件后,不调用close,却再打开另一个文件,
石刚(172106137) 12:57:51
那个handle就会没人关闭的。
蔡亮<errorcpp@qq.com> 12:58:39
刚刚用任务管理器看了下,析构的时候确实关闭了,,,
调试的时候跟进去看的太痛苦了,n多层,,,
********************************************************************
在后来的开发过程中我们发现一个问题:
(search key: fopen 最多打开多少句柄 fopen打开文件失败 fopen打开句柄限制)
项目中出现fopen打开文件失败现象,第一反应是文件句柄泄漏,然后查看任务管理器,进程句柄有1400个,以往常的经验。1400即使是泄漏也不会严重到无法打开新的句柄。于是写代码测试验证是不是fopen的问题
使用标准库的 fopen 打开的文件句柄总数是受限制的,经过测试我们发现默认情况下windows平台使用CreateFile至少可以创建3w个以上的文件句柄,而使用标准库的fopen最多则只能创建512个,后来发现标准库对这个确实是有限制的,有一个函数可以设置fopen能打开的句柄个数
// c标准库对fopen的文件个数有限制默认是512
::_setmaxstdio(2048);
linux平台也有相应的限制
********************************************************************
后来在网络上查到的,没有经过实际测试,仅作参考:
(search key: fstream最多打开多少句柄 )
我做过实验,fopen有限制,只能同时打开46,还是47个左右
ofstream
fstream
CreatFile这三种方法没有限制,可以同时打开很多文件(我测试的是打开10w个,再多,我没实验了)
*********************************************************************