Пока ваша программа работает, если вы продолжаете открывать файлы, не закрывая их, наиболее вероятным результатом будет то, что у вас закончатся файловые дескрипторы / дескрипторы, доступные для вашего процесса, и попытка открыть больше файлов в конечном итоге потерпит неудачу. В Windows это также может помешать другим процессам открывать или удалять открытые вами файлы, поскольку по умолчанию файлы открываются в эксклюзивном режиме общего доступа, который не позволяет другим процессам открывать их.
После выхода из вашей программы операционная система очистится после вас. Он закроет все файлы, которые вы оставили открытыми, когда завершит ваш процесс, и выполнит любую другую необходимую очистку (например, если файл был помечен как delete-on-close, он затем удалит файл; обратите внимание, что такого рода вещи являются платформой -специфический).
Однако, еще одна проблема, о которой следует помнить, это буферизованные данные . Большинство файловых потоков буферизует данные в памяти перед их записью на диск. Если вы используете FILE*
потоков из библиотеки stdio, то есть две возможности:
- Ваша программа завершилась нормально, либо вызвав функцию
exit(3)
, либо вернувшись из main
(который неявно вызывает exit(3)
).
- Ваша программа вышла ненормально; это может быть вызвано
abort(3)
или _Exit(3)
, смертью от сигнала / исключения и т. д.
Если ваша программа завершилась нормально, среда выполнения C позаботится о сбросе всех буферизованных потоков, которые были открыты. Итак, если вы буферизовали данные, записанные в FILE*
, который не был сброшен, он будет сброшен при нормальном выходе.
И наоборот, если ваша программа вышла ненормально, все буферизованные данные будут не сброшены. ОС просто говорит: «О, дорогой, вы оставили файловый дескриптор открытым, я лучше закрою его для вас», когда процесс завершится; он не знает, что где-то в памяти лежат случайные данные, которые программа намеревалась записать на диск, но не сделала этого. Так что будьте осторожны с этим.