Указатель на файл в C, динамически выделяемый?

#c #file

#c #файл

Вопрос:

(1) Когда я использую указатель на файл в C и забыл его закрыть. Мой компьютер сказал мне, что это была утечка памяти в программе. Я чувствую, означает ли это, что мы динамически выделяем пространство кучи для указателя на файл?

Комментарии:

1. Это зависит от реализации (т. е. компилятора, его библиотек, возможно, операционной системы). Вам нужно вызвать по одному, fclose для каждого fopen успешного.

Ответ №1:

  1. Я действительно считаю, что указатель, возвращаемый функцией fopen, инициализирован с помощью malloc, поэтому без его надлежащего освобождения (с использованием fclose) при завершении программы произойдет утечка памяти
  2. Не должно быть необходимости вызывать 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., я не понимаю, о чем вы спрашиваете)