2012-03-02 7 views
1

私は簡単な質問があります。私はデータを書き込むofstreamを持っています。私が完了してclose()に電話すると、ハンドルにdeleteと電話する必要がありますか?close()はクリーンアップを実行しますか?例えばofstream - close()操作後にオブジェクトハンドルを削除する必要がありますか?

mFileStream = new std::ofstream(LogPath.c_str(), std::ios::trunc); 
... 
mFileStream->Close(); 
//delete mFileStream? 

私の直感は、私はそれを割り当てたとしてイエスですが、私はそれを読んでどこかわかりません。誰でも明確にすることはできますか?

+2

この場合、 'delete'を呼び出す必要があります。オブジェクトはヒープに割り当てられ、 'close()'はこのオブジェクトにバインドされている実際のファイルへのすべての参照を閉じます。実際のオブジェクトのクリーンアップは決して処理されません。 –

答えて

8

はい、する必要があります。 C++では、newdeleteをペアにする必要があります。

けれども、あなたがする必要はありません。このような単純な場合には、あなたがスタック上にオブジェクトを割り当てることができ、それはあなたのために破壊され、これは、(より速く、より安全な)を強くお勧めします。

{ // enclosing scope (function, or control block) 
    ofstream mFileStream(LogPath.c_str(), std::ios::trunc); 
    ... 
    mFileStream.close(); // mFileStream is not a pointer any more, use the "." operator 
    // mFileStream destroyed for you here. "close" may even be called for you. 
} 

小文字:小文字の「close」です。

0

newで割り当てられたすべてのオブジェクトには、漏れを防ぐために対応するdeleteが必要です。 new[]delete[]で同じことが言えます(これらは別々の演算子で、BTWになります)。

as J.N.上記のコード例では、スタックを使用し、演算子の新規/削除を避けることができます。ストリームの使用が明確に定義されたスコープに限定されている場合、フリーストア(ヒープ)上にオブジェクトを作成する必要はありません。

ここで実際に必要としないものは、closeへの呼び出しです。ファイルストリームは既に破棄されているので(destuctor内で)閉じているので、省略しても問題ありません。実際には、これはfopen/fcloseよりもファイルストリームオブジェクトを使用する大きな利点の1つです。Do I need to manually close an ifstream?

さらに、StroustrupがRAIIイディオムに強く従うようにC++を使用すると、すべて手動で削除を呼び出す必要があるコードを書くのを避けるためです。これは、現時点ではあなたの頭の上に少しかもしれないが、我々はC++ 11 shared_ptrと、自動的に私たちのためのオブジェクトを破壊するunique_ptrなどに利用できるスマートポインタ持っている:あなたがCの領域に進出した場合

shared_ptr<ofstream> output_stream(new ofstream(...)); 
// ^^ This will not leak and the file will gracefully close 
// when 'output_stream' is destroyed. It makes the need to 
// call both delete and close unnecessary. 

を++例外処理では、デストラクタを使ってリソースを自動的にクリーンアップすることが便利であるだけでなく、安全かつ正確にコーディングするために非常に重要です。

関連する問題