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.
を++例外処理では、デストラクタを使ってリソースを自動的にクリーンアップすることが便利であるだけでなく、安全かつ正確にコーディングするために非常に重要です。
この場合、 'delete'を呼び出す必要があります。オブジェクトはヒープに割り当てられ、 'close()'はこのオブジェクトにバインドされている実際のファイルへのすべての参照を閉じます。実際のオブジェクトのクリーンアップは決して処理されません。 –