Все объекты, выделенные с помощью new
, должны иметь соответствующий delete
, чтобы избежать утечки.То же самое верно и для new[]
и delete[]
(это отдельные операторы, кстати).
Как указывал JN, в приведенном выше примере кода вы также можете использовать стек и оператор избегатьновый / удалить.Если использование потока ограничено какой-то четко определенной областью, нет необходимости создавать ваш объект в бесплатном хранилище (куче).
Здесь вам на самом деле не нужен вызов close
.Файловые потоки уже закрываются, когда они уничтожены (в деструкторе), поэтому его можно пропустить.Фактически, это одно из больших преимуществ использования объектов файлового потока перед fopen / fclose, как мы можем видеть здесь: Нужно ли вручную закрывать ifstream?
Кроме того, если вы используетеC ++ Способ, который Stroustrup поощряет, строго следуя его идиоме RAII, вы обычно избегаете написания кода, который должен вручную вызывать delete all вместе.Это может показаться немного сложным в данный момент, но у нас есть умные указатели, доступные в C ++ 11, такие как shared_ptr
и unique_ptr
, которые автоматически уничтожат объекты для нас:
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.
Если выУглубившись в область обработки исключений C ++, вы обнаружите, что использование деструктора для автоматической очистки ресурсов не только удобно, но и крайне необходимо для безопасного и правильного кодирования.