Вызывает ли утечка памяти повторное использование файловых указателей? - PullRequest
2 голосов
/ 03 июня 2011

Прошло несколько лет с тех пор, как я имел дело с C ++, так что терпите меня ...

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

У меня есть глобальная переменная FILE *fp;

В функции обратного вызова у меня есть:

fp = fopen(filen,"w");
// do some writing
fclose(fp);

Этот процесс повторяется несколько раз с одним и тем же указателем (fp). Является ли использование одного и того же указателя файла проблемой? Будет ли fclose () автоматически освобождать память для меня, или мне нужно будет удалить ее вручную? Существуют ли какие-либо ограничения, которые могут вызвать ошибку во время выполнения, если я пишу большое количество текста?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 03 июня 2011

Да, fclose освобождает все ресурсы, связанные с FILE *. Как правило, используйте free только для того, что было выделено с malloc, и только delete для того, что было выделено с new.

И вы никогда не «повторно используете» один и тот же указатель: вызов fopen вернет новый FILE *.

Кстати, поскольку вы занимаетесь C ++, подумайте о fstream. Он будет обрабатывать управление ресурсами для вас.

3 голосов
/ 03 июня 2011

Этот подход не вызовет утечек памяти, если за fopen всегда следует fclose перед следующим вызовом fopen.

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

0 голосов
/ 03 июня 2011

Несколько потоков, обращающихся к одному и тому же глобальному объекту, могут вызвать проблему, которая возникнет после того, как один из потоков закроет файл.

Открытие файла в следующий раз и изменение указателя файла не будут видны, когда это произошло,

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

0 голосов
/ 03 июня 2011

Звучит так, как будто вы все делаете правильно - fclose должен изменить все, что fopen делает, включая освобождение любых ресурсов, которые он может выделить.

...