2012-10-17 149 views
3

我不知道QFile時的行爲,在這種情況下,我真的需要調用QFile :: close()嗎?

bool Class::Function (const QString & name) 
{ 
    QFile fp (name); 
    if (fp.open (QIODevice::ReadOnly)) 
    { 
    // read file 
    return false; 
    } 
    return true; 
} 

嗯,它不是像在C(你必須關閉並免費)的文件*指針,這會是一個問題,如果我不叫一個QFile :: close()(它是否在銷燬時自動執行)?

回答

8

是的,它會自動(Qt documentation)關閉,所以沒有必要調用close()。

0

我喜歡調用函數返回前fp.close():這可能不是必要的,但未必是有害的任何。

Qt文檔可能不會反映出實際的代碼。例如,以下是在Qt的5.5.0源代碼:

/*! 
    Destroys the file object, closing it if necessary. 
*/ 
QFile::~QFile() 
{ 
} 

所以QFile::close()不會自動析構函數調用。文檔可能需要更新。

作爲一個附加優勢,使用QFile :: close()匹配QFile :: open()將確保在下一次調用函數bool Class::Function()時可以再次正確打開該文件。

+2

'QFile'繼承'QFileDevice',它的析構函數確實調用了'QFileDevice :: close()'。 – rsht

+0

你說得對。我忘了檢查'QFile'類的繼承鏈。所以在這種情況下不需要調用close()函數。感謝您指出了這一點。 – jonathanzh

+0

現在我看到了使用繼承的另一個缺點:必須將文檔複製到其派生類中,例如'QFileDevice' - >'QFile'。我不確定是否有更好的方法來在繼承鏈中的所有類中提供相同的功能。 – jonathanzh

相關問題