fopen中調用_getstream返回NULL導致文件打開失敗,ofstream的failbit被設置

問題描述:在導出一個package的時候,調用了一個函數去生出xml文件,在最後用ofstream去保存xml文件的時候,總是失敗。然而相同的代碼去導出別的package,一切正常。唯一的區別是正常的package較小。


問題分析:在trace代碼的時候發現,導致打開文件失敗的原因是fopen中調用_getstream返回了NULL,再跟蹤到_getstream函數發現,這個函數主要的功能是:試圖找到一個沒有被使用的stream去打開文件,如果達到512個並且沒有找到可用的stream,就會返回NULL。


問題解決:一開始以爲是handle使用的太多,導致沒有可用的handle,使用task manager勾選上handle去查看,發現並沒有想象中的那麼多。handle的嫌疑排除。

上網google了很久,也沒有準確的答案,沒辦法,只好把目光重新放回到fopen函數上,在函數入口設置斷點,看看都是哪些函數調用了fopen。結果就發現在導出package的時候,有一個計算函數被多次調用,而這個函數被別人加了log,logfile被多次打開,但沒有關閉。注掉log代碼,測試,一切ok。較小的package的計算較少,log被打開的次數較少,可能沒有達到512上限。


最終確定,問題就出在打開的文件太多,而又沒有及時關閉。導致stream都被佔用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章