4 回答

TA貢獻1998條經驗 獲得超6個贊
沒有
這就是RAII的目的,讓析構函數完成其工作。手動關閉它沒有什么害處,但這不是C ++方式,而是使用類在C中進行編程。
如果要在函數結束之前關閉文件,則可以始終使用嵌套作用域。
在標準(27.8.1.5類模板basic_ifstream)中,ifstream將使用basic_filebuf擁有實際文件句柄的成員來實現。它作為成員保存,以便當ifstream對象銷毀時,它還會在上調用銷毀器basic_filebuf。根據標準(27.8.1.2),該析構函數將關閉文件:
virtual ?basic_filebuf();
效果:銷毀class對象basic_filebuf<charT,traits>。來電close()。

TA貢獻1803條經驗 獲得超3個贊
您需要關閉文件嗎?
沒有
您應該關閉文件嗎?
要看。
您是否擔心文件無法正確關閉時可能發生的錯誤情況?請記住,setstate(failbit)如果失敗,則關閉呼叫。析構函數會調用close()自動為您因為RAII但不會離開你作為測試對象已不存在失敗位的方法。

TA貢獻1921條經驗 獲得超9個贊
您可以允許析構函數完成其工作。但是,就像任何RAII對象一樣,有時手動調用close可能會有所作為。例如:
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
return 0;
}
寫入文件內容。但:
#include <stdlib.h>
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
exit(0);
}
沒有。在極少數情況下,進程突然退出。崩潰過程可能會執行類似的操作。

TA貢獻1775條經驗 獲得超8個贊
不,這是由ifstream
析構函數自動完成的。您應該手動調用它的唯一原因是因為fstream
實例的作用域很大,例如,如果它是壽命很長的類實例的成員變量。
- 4 回答
- 0 關注
- 3414 瀏覽
相關問題推薦
添加回答
舉報