#c #file
#c #файл
Вопрос:
(1) Когда я использую указатель на файл в C и забыл его закрыть. Мой компьютер сказал мне, что это была утечка памяти в программе. Я чувствую, означает ли это, что мы динамически выделяем пространство кучи для указателя на файл?
Комментарии:
1. Это зависит от реализации (т. е. компилятора, его библиотек, возможно, операционной системы). Вам нужно вызвать по одному,
fclose
для каждогоfopen
успешного.
Ответ №1:
- Я действительно считаю, что указатель, возвращаемый функцией fopen, инициализирован с помощью malloc, поэтому без его надлежащего освобождения (с использованием fclose) при завершении программы произойдет утечка памяти
- Не должно быть необходимости вызывать fclose, если вы никогда не использовали fopen. Я не могу придумать причину, по которой вам понадобился бы указатель на файл, если бы вы не собирались использовать fopen.
Комментарии:
1. Как насчет
stdout
, егоFILE *
?
Ответ №2:
Предполагая, что ваша программа завершилась возвратом из main
или вызовом exit()
, все открытые файлы автоматически закрываются (и все исходящие потоки сбрасываются). Это указано в стандарте C; см. N1570 раздел 7.21.3, параграф 5.
Рекомендуется явно вызывать fclose()
любые FILE*
объекты, полученные из fopen()
, но это не совсем необходимо.
Что касается вашего второго вопроса, если я правильно понимаю, если вы не вызываете, fopen()
то вам не следует вызывать fclose()
. Передача FILE*
значения в fclose()
, если оно не было получено путем вызова fopen()
или какой-либо подобной функции, является ошибкой.
Если у вас утечка памяти в вашей программе (откуда вы знаете; вы запускали valgrind?), то, вероятно, это что-то другое.
Ответ №3:
fopen()
может использоваться динамически выделяемая память, если вы не закроете ее, память не будет повторно освобождена, и такие инструменты, как valgrind, сообщают об этом как об утечке памяти.
(Что касается вашего вопроса 2., я не понимаю, о чем вы спрашиваете)