Что произойдет, если я никогда не вызову `close` для открытого потока файлов?

Ниже приведен код для того же случая.

#include <iostream>
#include <fstream>

using namespace std;

int main () {
    ofstream myfile;
    myfile.open ("example.txt");
    myfile << "Writing this to a file.\n";
    //myfile.close();
    return 0;
}

Какая будет разница, если я раскомментирую myfile.close() линия?

4 ответа

Решение

Нет никакой разницы. Деструктор файлового потока закроет файл.

Вы также можете положиться на конструктор, чтобы открыть файл вместо вызова open(), Ваш код может быть уменьшен до этого:

#include <fstream>

int main()
{
  std::ofstream myfile("example.txt");
  myfile << "Writing this to a file.\n";
}

Укрепить ответ Джанхопанзы с некоторыми ссылками из std::fstream документация

(Деструктор)
[виртуальный](неявно объявленный)

уничтожает basic_fstream и связанный с ним буфер, закрывает файл (функция виртуального открытого члена)

В этом случае ничего не произойдет, и время выполнения кода будет значительно меньше.

Однако, если ваши коды выполняются в течение длительного времени, когда вы постоянно открываете файлы и не закрываете их, через определенное время может произойти сбой во время выполнения.

когда вы открываете файл, операционная система создает запись, которая представляет этот файл и сохраняет информацию об этом открытом файле. Так что если в вашей ОС открыто 100 файлов, то в ОС будет 100 записей (где-то в ядре). Эти записи представлены целыми числами, такими как (...100, 101, 102....). Этот номер записи является дескриптором файла. Так что это просто целое число, которое уникально представляет открытый файл в операционной системе. Если ваш процесс открывает 10 файлов, то ваша таблица процессов будет иметь 10 записей для файловых дескрипторов.

Кроме того, именно поэтому вы можете исчерпать файловые дескрипторы, если открываете много файлов одновременно. Что помешает запуску систем *nix, так как они постоянно открывают дескрипторы для добавления в /proc.

Подобная вещь должна произойти в случае всей операционной системы.

При нормальных условиях разницы нет.

НО в исключительных условиях (с небольшими изменениями) вызов close может вызвать исключение.

int main()
{
    try
    {
        ofstream myfile;
        myfile.exceptions(std::ios::failbit | std::ios::badbit);
        myfile.open("example.txt");

        myfile << "Writing this to a file.\n";


        // If you call close this could potentially cause an exception
        myfile.close();


        // On the other hand. If you let the destructor call the close()
        // method. Then the destructor will catch and discard (eat) the
        // exception.
    }
    catch(...)
    {
        // If you call close(). There is a potential to get here.
        // If you let the destructor call close then the there is
        // no chance of getting here.
    }
}
Другие вопросы по тегам